{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# OPTIONS_GHC -fno-warn-orphans #-} 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 = TFB.build "[" <> TFB.build `fmap` lst "]" build lst = mconcat $ [TFB.build ("[" :: String)] <> (List.intersperse (TFB.build (", " :: String)) (TFB.build `fmap` lst)) <> [TFB.build ("]" :: String)]