module Canteven.Log (
setupLogging
) where
import Canteven.Log.Types (LogPriority(LP),
LoggingConfig(LoggingConfig, logfile, level, loggers),
LoggerDetails(LoggerDetails, loggerName, loggerLevel))
import Control.Applicative ((<$>))
import System.Directory (createDirectoryIfMissing)
import System.FilePath (dropFileName)
import System.IO (stdout)
import System.Log (Priority(DEBUG))
import System.Log.Formatter (simpleLogFormatter)
import System.Log.Handler (setFormatter)
import System.Log.Handler.Simple (fileHandler, streamHandler)
import System.Log.Logger (updateGlobalLogger, setHandlers, setLevel)
import qualified Canteven.Config as Config (canteven)
setupLogging :: IO ()
setupLogging =
installConfig =<< Config.canteven
installConfig :: LoggingConfig -> IO ()
installConfig LoggingConfig {logfile, level = LP level, loggers} = do
fileHandlers <-
case logfile of
Nothing -> return []
Just filename -> do
createDirectoryIfMissing True (dropFileName filename)
file <- tweak <$> fileHandler filename DEBUG
return [file]
console <- tweak <$> streamHandler stdout DEBUG
let handlers = console:fileHandlers
updateGlobalLogger "" (setLevel level . setHandlers handlers)
sequence_ [
updateGlobalLogger loggerName (setLevel loggerLevel) |
LoggerDetails {loggerName = Just loggerName, loggerLevel = LP loggerLevel} <- loggers
]
where
tweak h = setFormatter h (simpleLogFormatter logFormat)
logFormat = "[$time] $prio $loggername[$tid]: $msg"