X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLogging.hs;h=63101c6f3735da2dbbbc1b913ae6ec1bc7719105;hb=da61a6744550e974688d46b23b11f1a842e4da2e;hp=fb1bfc658c91a536ff72b81627319681211a9588;hpb=a8abe8f8e85662f544235f1d0a43524e5077078a;p=dead%2Fhtsn.git diff --git a/src/Logging.hs b/src/Logging.hs index fb1bfc6..63101c6 100644 --- a/src/Logging.hs +++ b/src/Logging.hs @@ -6,14 +6,17 @@ module Logging ( log_warning ) where +import Control.Monad ( when ) +import System.Environment ( getProgName ) import System.Log.Formatter ( simpleLogFormatter ) import System.Log.Handler ( setFormatter ) -import System.Log.Handler.Simple ( fileHandler ) +import System.Log.Handler.Simple ( GenericHandler, fileHandler ) import System.Log.Handler.Syslog ( Facility ( USER ), openlog ) import System.Log.Logger ( - Priority ( DEBUG, INFO ), + Priority ( INFO ), + addHandler, debugM, errorM, infoM, @@ -24,34 +27,58 @@ import System.Log.Logger ( 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 :: 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 +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)