X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLogging.hs;h=63101c6f3735da2dbbbc1b913ae6ec1bc7719105;hb=da61a6744550e974688d46b23b11f1a842e4da2e;hp=94f4f7aa63bc383c23277c13bb8d93dd5b713cb3;hpb=8c69c28e5ab5ef5a5ed64411e1213e504a6a309e;p=dead%2Fhtsn.git diff --git a/src/Logging.hs b/src/Logging.hs index 94f4f7a..63101c6 100644 --- a/src/Logging.hs +++ b/src/Logging.hs @@ -6,13 +6,17 @@ module Logging ( log_warning ) where -import System.Log.Handler.Simple ( fileHandler ) +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 ) import System.Log.Handler.Syslog ( Facility ( USER ), - Option ( PID ), openlog ) import System.Log.Logger ( - Priority ( DEBUG, INFO ), + Priority ( INFO ), + addHandler, debugM, errorM, infoM, @@ -22,26 +26,59 @@ import System.Log.Logger ( updateGlobalLogger, 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 -init_logging :: FilePath -> Priority -> Bool -> IO () -init_logging log_file log_level syslog - | syslog == True = do - handler <- openlog rootLoggerName [PID] USER level - updateGlobalLogger rootLoggerName (setLevel level . setHandlers [handler]) - | otherwise = do - handler <- fileHandler log_file level - 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 + +-- | 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 + -- First set the global log level and clear the default handler. + let no_handlers = [] :: [GenericHandler a] + updateGlobalLogger rootLoggerName (setLevel log_level . + setHandlers no_handlers) + + when syslog $ do + let min_level = INFO + let sl_level = if log_level < min_level then min_level else log_level + + -- The syslog handle gets its own level which will cowardly refuse + -- to log all debug info (i.e. the entire feed) to syslog. + sl_handler' <- openlog rootLoggerName [] USER sl_level + + -- Syslog should output the date by itself. + 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) + + case log_file of + Nothing -> return () + Just lf -> do + lf_handler' <- fileHandler lf log_level + let lf_formatter = simpleLogFormatter "$time: htsn[$pid] $prio: $msg" + let lf_handler = setFormatter lf_handler' lf_formatter + updateGlobalLogger rootLoggerName (addHandler lf_handler)