Log: write to file


I basically want to:

create mylog.log
log something to mylog.log

any way to get log to write to a file?


try this

property logName : "my.log"
property logFolder : ""

set logFolder to ((path to library folder from user domain as text) & "Logs:")
write_log from "test"

on write_log from theMessage
	tell (current date) to set timestamp to short date string & space & time string & ": "
	set logFile to logFolder & logName
		set the logStream to open for access file logFile with write permission
		set logFileEof to get eof of the logStream
		write timestamp & theMessage & return to logStream starting at eof as «class utf8»
		close access logStream
		return true
	on error
			close access file logFile
		end try
		return false
	end try
end write_log

Thanks. Works perfectly. I’m slightly surprised it’s not simpler - AS/S would sometimes need to write error logs, e.g. if the application has little GUI or may not be visible at all.

By the way, what exactly is eof?

[E]nd [O]f [F]ile, a pointer to the last character (+1) of the file.
If EOF is set to 0, the contents of the file will be overwritten at the next write access

My fancier version, based on StefanK’s, which allows some indenting for more human readability in complex logs or troubleshooting:

property g_debug : true
property g_log_file_name : "LOG--Overnight Automation.txt"

--Log Entry Generation
-- with help from StephanK of MacScripter
-- http://bbs.applescript.net/viewtopic.php?pid=76607#p76607
on logMe(log_string, indent_level)
	if g_debug is true then --allows turning the debugger on and off so my logMe's can be left in final version
		set log_target to ("Data: Automation:Logs:" & g_log_file_name) as text
			set log_file_ref to open for access file log_target with write permission
			repeat indent_level times
				write tab to log_file_ref starting at eof
			end repeat
			write ((log_string as text) & return) to log_file_ref starting at eof
			close access log_file_ref
			return true
		on error
				close access file log_target
			end try
			return false
		end try
	end if
end logMe

Example uses:

my logMe("Transfer Folder Cleaner and Logger End--" & (current date), 1)
my logMe("Items over " & g_mark_days & " days: " & (number of items in files_to_mark), 2)