where
import Control.Monad ( when )
+import System.Environment ( getProgName )
import System.Log.Formatter ( simpleLogFormatter )
import System.Log.Handler ( setFormatter )
import System.Log.Handler.Simple ( GenericHandler, fileHandler )
warningM )
+-- | Log a message at the DEBUG level.
log_debug :: String -> IO ()
log_debug = debugM rootLoggerName
+-- | Log a message at the ERROR level.
log_error :: String -> IO ()
log_error = errorM rootLoggerName
+-- | Log a message at the INFO level.
log_info :: String -> IO ()
log_info = infoM rootLoggerName
+-- | Log a message at the WARNING level.
log_warning :: String -> IO ()
log_warning = warningM rootLoggerName
--- | Why don't we take a Configuration as an argument? Because it
+-- | Set up the logging. All logs are handled by the global "root"
+-- logger provided by HSLogger. We remove all of its handlers so
+-- that it does nothing; then we conditionally add back two handlers
+-- -- one for syslog, and one for a normal file -- dependent upon
+-- the 'syslog' and 'log_file' configuration items.
+--
+-- Why don't we take a Configuration as an argument? Because it
-- would create circular imports!
init_logging :: Maybe FilePath -> Priority -> Bool -> IO ()
init_logging log_file log_level syslog = do
sl_handler' <- openlog rootLoggerName [] USER sl_level
-- Syslog should output the date by itself.
- let sl_formatter = simpleLogFormatter "htsn[$pid] $prio: $msg"
+ program_name <- getProgName
+ let sl_formatter = simpleLogFormatter $
+ program_name ++ "[$pid] $prio: $msg"
let sl_handler = setFormatter sl_handler' sl_formatter
updateGlobalLogger rootLoggerName (addHandler sl_handler)