module Logging ( init_logging, log_debug, log_error, log_info, log_warning ) where import System.Log.Formatter ( simpleLogFormatter ) import System.Log.Handler ( setFormatter ) import System.Log.Handler.Simple ( fileHandler ) import System.Log.Handler.Syslog ( Facility ( USER ), openlog ) import System.Log.Logger ( Priority ( DEBUG, INFO ), debugM, errorM, infoM, rootLoggerName, setHandlers, setLevel, updateGlobalLogger, warningM ) log_debug :: String -> IO () log_debug = debugM rootLoggerName log_error :: String -> IO () log_error = errorM rootLoggerName log_info :: String -> IO () log_info = infoM rootLoggerName log_warning :: String -> IO () log_warning = warningM rootLoggerName -- | Why don't we take a Configuration as an argument? Because it -- would create circular imports! init_logging :: FilePath -> Priority -> Bool -> IO () init_logging log_file log_level syslog | syslog == True = do handler' <- openlog rootLoggerName [] USER level -- Syslog should output the date by itself. let slf = simpleLogFormatter "htsn[$pid] $prio: $msg" let handler = setFormatter handler' slf updateGlobalLogger rootLoggerName (setLevel level . setHandlers [handler]) | otherwise = do handler' <- fileHandler log_file level let slf = simpleLogFormatter "$time: htsn[$pid] $prio: $msg" let handler = setFormatter handler' slf updateGlobalLogger rootLoggerName (setLevel level . setHandlers [handler]) where min_level = if syslog then INFO else DEBUG level = if log_level < min_level then min_level else log_level