packages feed

hbro-1.2.0.0: library/Hbro/Logger.hs

{-# LANGUAGE OverloadedStrings #-}
module Hbro.Logger
    ( module X
    , initialize
-- * Redefinitions
    , debugM
    , errorM
    , infoM
) where

-- {{{ Imports
import Hbro.Prelude

import Control.Concurrent (myThreadId)

import Data.Text (justifyLeft, replace)

import System.Log as X (Priority(..))
import System.Log.Formatter
import System.Log.Handler.Simple
import System.Log.Logger (Logger, rootLoggerName, setLevel, setHandlers, updateGlobalLogger)
import qualified System.Log.Logger as L
-- }}}

initialize :: (BaseIO m) => Priority -> m ()
initialize = io . updateGlobalLogger rootLoggerName . setup

setup :: Priority -> Logger -> Logger
setup level = setLevel level . setHandlers [logHandler]

logHandler :: GenericHandler ()
logHandler = GenericHandler
    { priority  = DEBUG
    , formatter = logFormatter "$my_time $my_prio $my_tid $msg"
    , privData  = ()
    , writeFunc = \_ t -> putStrLn $ pack t
    , closeFunc = \_ -> return ()
    }

logFormatter :: String -> LogFormatter a
logFormatter string handler (prio, message) loggername = varFormatter
    [ ("my_prio", return $ formatPriority prio)
    , ("my_time", formatTime defaultTimeLocale "%F %T" <$> getCurrentTime)
    , ("my_tid",  unpack . justifyLeft 5 ' ' . replace "ThreadId " "#" . tshow <$> myThreadId)
    ]
    string handler (prio, message) loggername

formatPriority :: Priority -> String
formatPriority WARNING   = "WARN "
formatPriority CRITICAL  = "CRIT "
formatPriority INFO      = "INFO "
formatPriority p         = unpack . justifyLeft 5 ' ' . take 5 $ tshow p

-- | Better version of 'debugM'
debugM :: (BaseIO m) => Text -> Text -> m ()
debugM a b = io $ L.debugM (unpack a) (unpack b)

-- | Better version of 'errorM'
errorM :: (BaseIO m) => Text -> Text -> m ()
errorM a b = io $ L.errorM (unpack a) (unpack b)

-- | Better version of 'infoM'
infoM :: (BaseIO m) => Text -> Text -> m ()
infoM a b = io $ L.infoM (unpack a) (unpack b)