-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.
+ let sl_formatter = simpleLogFormatter "htsn[$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)