Code archives/Miscellaneous/Logger
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
See the included example code for usage. Default functionality includes logging to streams and tlists, to expand on that simply write your own output function using the existing ones as a reference. Requires this archive entry as a dependency: http://www.blitzmax.com/codearcs/codearcs.php?code=3044 | |||||
' --+-----------------------------------------------------------------------------------------+-- ' | This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com) | ' | It is released as public domain. Please don't interpret that as liberty to claim credit | ' | that isn't yours, or to sell this code when it could otherwise be obtained for free | ' | because that would be a really shitty thing of you to do. | ' --+-----------------------------------------------------------------------------------------+-- superstrict import brl.stream import brl.linkedlist import "timestamp.bmx" ' available here: http://www.blitzmax.com/codearcs/codearcs.php?code=3044 rem ' Example code print "~nlogger targeting file stream:" local path$ = "loggertestfile.txt" if filetype(path) = 0 local stream:tstream = writefile(path) local filelog:Logger = Logger.streamtarget(stream) filelog.info("girl I want") filelog.warning("to be with you") filelog.critical("all of the time") closefile stream local file:tstream = readfile("loggertestfile.txt") while not eof(file) print file.readline() wend closefile file deletefile path else print "oops, example file already exists. not overwriting it just to be safe." endif print "~nlogger targeting standard io:" local stdiolog:Logger = Logger.consoletarget() stdiolog.debug("well") stdiolog.info("that's just, like") stdiolog.warning("your opinion, man") print "~nlogger targeting list:" local list:tlist = new tlist local listlog:Logger = Logger.listtarget(list) listlog.warning("happy feet") listlog.error("WOMBO COMBO") listlog.critical("THAT AIN'T FALCO") listlog.info("we're all a little bit hard") for local message:LoggerMessage = eachin list print message.toString() next endrem ' these functions tell loggers how to output to target types, you can also implement your own as needed private function StreamLogger(target:object,message:LoggerMessage) tstream(target).writeline(message.toString()) end function function ListLogger(target:object,message:LoggerMessage) tlist(target).addlast(message) end function public ' logger object, this thing does the actual logging type Logger ' helpful constants const PREFIX_DEBUG$ = "DEBUG: " const PREFIX_INFO$ = "INFO: " const PREFIX_WARNING$ = "WARNING: " const PREFIX_ERROR$ = "ERROR: " const PREFIX_CRITICAL$ = "CRITICAL: " const PRIORITY_DEBUG% = 10 const PRIORITY_INFO% = 20 const PRIORITY_WARNING% = 30 const PRIORITY_ERROR% = 40 const PRIORITY_CRITICAL% = 50 ' list of logged messages field messages:tlist = new tlist ' minimum priority to output a message to the target field minpriority% = 0 ' the target object for output field target:object ' the function to use for writing logged messages to the target field outputfunc(target:object,message:LoggerMessage) ' create a new logger function create:Logger(target:object,outputfunc(t:object,m:LoggerMessage),minpriority%) local n:Logger = new Logger n.settarget(target,outputfunc) n.minpriority = minpriority return n end function function streamtarget:Logger(target:tstream,minpriority%=0) return create(target,StreamLogger,minpriority) end function function consoletarget:Logger(minpriority%=0) return create(standardiostream,StreamLogger,minpriority) end function function listtarget:Logger(target:tlist,minpriority%=0) return create(target,ListLogger,minpriority) end function ' set logger output target method settarget:Logger(targ:object,func(t:object,m:LoggerMessage)) target = targ outputfunc = func end method method setstreamtarget:Logger(targ:tstream) settarget(targ,StreamLogger) return self end method method setconsoletarget:Logger() settarget(standardiostream,StreamLogger) end method method setlisttarget:Logger(targ:tlist) settarget(targ,ListLogger) end method ' get/set min message priority method getpriority%() return minpriority end method method setpriority:Logger(priority%) minpriority = priority return self end method ' logging methods method debug:LoggerMessage(text$) local message:LoggerMessage = LoggerMessage.debug(text) output(message,target,outputfunc) return message end method method info:LoggerMessage(text$) local message:LoggerMessage = LoggerMessage.info(text) output(message,target,outputfunc) return message end method method warning:LoggerMessage(text$) local message:LoggerMessage = LoggerMessage.warning(text) output(message,target,outputfunc) return message end method method error:LoggerMessage(text$) local message:LoggerMessage = LoggerMessage.error(text) output(message,target,outputfunc) return message end method method critical:LoggerMessage(text$) local message:LoggerMessage = LoggerMessage.critical(text) output(message,target,outputfunc) return message end method method output%(message:LoggerMessage,target:object,func(t:object,m:LoggerMessage)) messages.addlast(message) if target and outputfunc and message.priority >= minpriority outputfunc(target,message) return true else return false endif end method ' flush the logger's messages buffer method flush() messages.clear() end method ' retroactively write all buffered messages to the output target (or to the logger's current target if none is specified) method writeall:Logger(targ:object=null,func(t:object,m:LoggerMessage)=null) if not targ targ = target if not func func = outputfunc for local message:LoggerMessage = eachin messages output(message,targ,func) next return self end method end type ' logger message object, loggers make these type LoggerMessage ' the text content of the message field text$ ' a prefix for the message, such as "INFO: " or "ERROR: " field prefix$ ' the message's priority; the logger's minimum priority must be at least this high in order for it to output to target field priority% ' the time when the message was created and its string representation field time:timestamp field timestr$ ' message creation methods function create:LoggerMessage(text$,prefix$,priority%) local n:LoggerMessage = new LoggerMessage n.text = text n.prefix = prefix n.priority = priority n.time = timestamp.now() n.timestr = n.time.todottedstring() return n end function function debug:LoggerMessage(text$) return create(text,Logger.PREFIX_DEBUG,Logger.PRIORITY_DEBUG) end function function info:LoggerMessage(text$) return create(text,Logger.PREFIX_INFO,Logger.PRIORITY_INFO) end function function warning:LoggerMessage(text$) return create(text,Logger.PREFIX_WARNING,Logger.PRIORITY_WARNING) end function function error:LoggerMessage(text$) return create(text,Logger.PREFIX_ERROR,Logger.PRIORITY_ERROR) end function function critical:LoggerMessage(text$) return create(text,Logger.PREFIX_CRITICAL,Logger.PRIORITY_CRITICAL) end function ' turn it into a string method tostring$() return timestr + " " + prefix + text end method end type |
Comments
None.
Code Archives Forum