module Network.Services.TSN.Logging (
init_logging,
log_debug,
log_error,
log_info,
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 ( GenericHandler, fileHandler )
import System.Log.Handler.Syslog (
Facility ( USER ),
openlog )
import System.Log.Logger (
Priority ( INFO ),
addHandler,
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
init_logging :: Priority
-> Maybe FilePath
-> Bool
-> IO ()
init_logging log_level log_file syslog = do
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
sl_handler' <- openlog rootLoggerName [] USER sl_level
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)