module LuminescentDreams.Logger.Standard ( logMsgStd, formatMsgStd ) where
import Data.Monoid
import qualified Data.Text.Format as TF
import qualified Data.Text.Lazy as T
import qualified Data.Text.Buildable as TFB
import qualified Data.Time as Time
import qualified Data.List as List
import LuminescentDreams.Logger.Internal
data LogMsg = LogMsg LogLevel [(String, String)] String
logMsgStd :: Logger -> LogLevel -> [(String, String)] -> String -> IO ()
logMsgStd l lvl tags text = logMsg_ l (LogMsg lvl tags text)
logMsg_ :: Logger -> LogMsg -> IO ()
logMsg_ (Logger writer pri) msg@(LogMsg lvl _ _) =
if lvl >= pri
then do
t <- Time.getCurrentTime
writer $ formatMsgStd t msg
else return ()
formatMsgStd :: Time.UTCTime -> LogMsg -> T.Text
formatMsgStd t (LogMsg lvl tags text) =
TF.format "{} {} {} {}" (Time.formatTime Time.defaultTimeLocale "%Y-%m-%d %H:%M:%S" t, lvl, tags, text)
instance TFB.Buildable (String, String) where
build (name, value) = TFB.build $ "(" <> name <> ", " <> value <> ")"
instance TFB.Buildable [(String, String)] where
build lst =
mconcat $ [TFB.build ("[" :: String)]
<> (List.intersperse (TFB.build (", " :: String)) (TFB.build `fmap` lst))
<> [TFB.build ("]" :: String)]