/* logger.p
*
* to instantiate:
*
* run logger.p persistent
*
* three ways to call it from your code:
*
* publish "logMsg" ( msgLevel, messageText ). // requires no knowledge in the caller, no error if logger.p has not first been run persistently
* run doLogMsg ( msgLevel, messageText ). // requires no knowledge in the caller, error if logger.p is not run first
* logMsg( msgLevel, messageText ). // requires forward declaration in the caller
*/
subscribe to "setLogName" anywhere run-procedure "setLogName".
subscribe to "logMsg" anywhere run-procedure "doLogMsg".
define variable logMsgLevel as integer no-undo initial 3.
define variable logMsgFileName as character no-undo initial "application.log".
define stream logStream.
/* install self as a session super-procedure
*/
session:add-super-procedure( this-procedure ).
return.
/* housekeeping
*/
procedure setLogName:
define input parameter logName as character no-undo.
logMsgFileName = logName.
return.
end.
procedure setLogLevel:
define input parameter logLevel as integer no-undo.
logMsgLevel = logLevel.
return.
end.
/* to use this function directly from another procedure you must first declare it in that procedure:
*
* function logMsg returns logical ( input msgLevel as integer, input msgText as character ) in super.
*/
function logMsg returns logical ( input msgLevel as integer, input msgText as character ):
run doLogMsg( msgLevel, msgText ).
return true.
end.
/* procedures do not need to be forward declared but we can not have a function and a procedure with the same name
*/
procedure doLogMsg:
define input parameter msgLevel as integer no-undo.
define input parameter msgText as character no-undo.
if msgLevel <= logMsgLevel then
do:
output stream logStream to value( logMsgFileName ) append.
put stream logStream unformatted today " " string( time, "hh:mm:ss" ) " " msgText skip.
output stream logStream close.
end.
return.
end.
试验台示例:
/* test logger.p
*/
/* run doLogMsg ( 3, "test a" ). */
/* logMsg( 3, "test b" ). */
function logMsg returns logical ( input msgLevel as integer, input msgText as character ) in super. /* usually this is in a include file in the procedure header */
publish "logMsg" ( 3, "test 1" ).
run ./logger.p persistent. /* loads logger.p into memory... */
run setLogName ( "test.log" ).
publish "logMsg" ( 3, "test 2" ).
run doLogMsg ( 3, "test 3" ).
logMsg( 3, "test 4" ).