/** * Strategies for logging */ module util/log imports collection/tuple/cons collection/tuple/common collection/list/common signature constructors Emergency : Severity Alert : Severity Critical : Severity Error : Severity Warning : Severity Notice : Severity Info : Severity Debug : Severity Vomit : Severity strategies debug-area(s|msg) = log(|Debug(), <conc-strings> ("entering area ", msg)) ; s ; log(|Debug(), <conc-strings> ("leaving area ", msg)) risky(s|msg) = risky(s|Error(), msg) risky(s|severity, msg) = restore(s, log(|severity, msg, <id>)) strategies log(|severity : Severity, msg, term) = if-log-severity( log(|severity, msg) ; where( <copy-char; log-puts> (<add> (<severity-string; string-length> severity, 3), ' ') ; <write-in-text-to-stream> (<log-stream>, term) ; <log-puts> "\n" ) | severity ) log(|severity : Severity, msg) = if-log-severity( where( <try(not(is-list) ; ![<id>])>msg ; map(is-string <+ write-to-string) ; <concat-strings ; log-puts> ["[ ", <log-src>, " | ", <severity-string> severity, " ] " | <id> ] ; <log-puts> "\n" ) | severity ) if-log-severity(s | severity) = if-verbose(s | <verbose-level> severity) strategies log-stream = <get-config> "log-stream" <+ <getenv> "STRATEGO_LOG" ; <fopen> (<id>, "a") <+ <stderr-stream> () set-log-stream = <set-config> ("log-stream", <id>) log-puts = <fputs> (<id>, <log-stream> ()) log-src = whoami; base-filename <+ !"identity crisis" rules verbose-level : Emergency() -> -10 verbose-level : Alert() -> -5 verbose-level : Critical() -> -2 verbose-level : Error() -> 0 verbose-level : Warning() -> 1 verbose-level : Info() -> 1 verbose-level : Notice() -> 2 verbose-level : Debug() -> 4 verbose-level : Vomit() -> 10 severity-string : Emergency() -> "emergency" severity-string : Alert() -> "alert" severity-string : Critical() -> "critical" severity-string : Error() -> "error" severity-string : Info() -> "info" severity-string : Warning() -> "warning" severity-string : Notice() -> "notice" severity-string : Debug() -> "debug" severity-string : Vomit() -> "vomit" string-to-level : "emergency" -> level where <verbose-level> Emergency() => level string-to-level : "alert" -> level where <verbose-level> Alert() => level string-to-level : "critical" -> level where <verbose-level> Critical() => level string-to-level : "error" -> level where <verbose-level> Error() => level string-to-level : "warning" -> level where <verbose-level> Warning() => level string-to-level : "notice" -> level where <verbose-level> Notice() => level string-to-level : "info" -> level where <verbose-level> Info() => level string-to-level : "debug" -> level where <verbose-level> Debug() => level string-to-level : "vomit" -> level where <verbose-level> Vomit() => level strategies /** * Logs the specified message as critical and terminates the program * with exit code 1. * * @type a -> _ */ fatal-err(|msg : String) = log(|Critical(), msg, <id>); <exit> 1 /** * Logs the specified message as an error. * * @type a -> a */ err(|msg : String) = log(|Error(), msg, <id>) /** * Logs the specified message as a warning. * * @type a -> a */ warn(|msg : String) = log(|Warning(), msg, <id>) /** * Logs the specified message as a notice. * * @type a -> a */ notice(|msg : String) = log(|Notice(), msg, <id>) /** * Logs the specified message as a debug. * * @type a -> a */ dbg(|msg : String) = log(|Debug(), msg, <id>) strategies /** * Logs the specified message as critical and terminates the program * with exit code 1. * * @type a -> _ */ fatal-err-msg(|msg : String) = log(|Critical(), msg); <exit> 1 /** * Logs the specified message as an error. * * @type a -> a */ err-msg(|msg : String) = log(|Error(), msg) /** * Logs the specified message as a warning. * * @type a -> a */ warn-msg(|msg : String) = log(|Warning(), msg) /** * Logs the specified message as a notice. * * @type a -> a */ notice-msg(|msg : String) = log(|Notice(), msg)