module Colog.Json
(
LoggerEnv
, mkLogger
, emptyLogger
, unLogger
, ls
, showLS
, LogStr
, logDebug
, logNotice
, logInfo
, logErr
, logWarn
, logAlert
, logCrit
, logEmergency
, Severity(..)
, addContext
, sl
, addNamespace
) where
import Colog.Core hiding (Severity)
import Colog.Json.Internal.Structured
import Control.Concurrent
import Control.Monad.IO.Class
import qualified Data.Sequence as Seq
import qualified Data.Text as T
data LoggerEnv = LoggerEnv
{ LoggerEnv -> LogAction IO Message
action :: LogAction IO Message
, LoggerEnv -> Seq Structured
context :: Seq.Seq Structured
}
emptyLogger :: LoggerEnv
emptyLogger :: LoggerEnv
emptyLogger = LogAction IO Message -> Seq Structured -> LoggerEnv
LoggerEnv ((Message -> IO ()) -> LogAction IO Message
forall (m :: * -> *) msg. (msg -> m ()) -> LogAction m msg
LogAction ((Message -> IO ()) -> LogAction IO Message)
-> (Message -> IO ()) -> LogAction IO Message
forall a b. (a -> b) -> a -> b
$ \Message
_ -> () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) Seq Structured
forall a. Seq a
Seq.empty
mkLogger :: LogAction IO Message -> LoggerEnv
mkLogger :: LogAction IO Message -> LoggerEnv
mkLogger LogAction IO Message
action = LogAction IO Message -> Seq Structured -> LoggerEnv
LoggerEnv LogAction IO Message
action Seq Structured
forall a. Seq a
Seq.empty
unLogger :: LoggerEnv -> LogAction IO (Severity, LogStr)
unLogger :: LoggerEnv -> LogAction IO (Severity, LogStr)
unLogger (LoggerEnv LogAction IO Message
action Seq Structured
st) = ((Severity, LogStr) -> IO ()) -> LogAction IO (Severity, LogStr)
forall (m :: * -> *) msg. (msg -> m ()) -> LogAction m msg
LogAction (((Severity, LogStr) -> IO ()) -> LogAction IO (Severity, LogStr))
-> ((Severity, LogStr) -> IO ()) -> LogAction IO (Severity, LogStr)
forall a b. (a -> b) -> a -> b
$ \(Severity
lvl, LogStr
msg) -> do
ThreadId
tid <- IO ThreadId
myThreadId
LogAction IO Message -> Message -> IO ()
forall (m :: * -> *) msg. LogAction m msg -> msg -> m ()
unLogAction LogAction IO Message
action (Message -> IO ()) -> Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Severity -> Int -> Seq Structured -> LogStr -> Message
Message Severity
lvl (ThreadId -> Int
mkThreadId ThreadId
tid) Seq Structured
st LogStr
msg
addContext
:: PushContext
-> LoggerEnv
-> LoggerEnv
addContext :: PushContext -> LoggerEnv -> LoggerEnv
addContext (PushContext Seq Structured -> Seq Structured
f) LoggerEnv{LogAction IO Message
Seq Structured
context :: Seq Structured
action :: LogAction IO Message
context :: LoggerEnv -> Seq Structured
action :: LoggerEnv -> LogAction IO Message
..} = LoggerEnv :: LogAction IO Message -> Seq Structured -> LoggerEnv
LoggerEnv{context :: Seq Structured
context = Seq Structured -> Seq Structured
f Seq Structured
context, LogAction IO Message
action :: LogAction IO Message
action :: LogAction IO Message
..}
addNamespace :: T.Text -> LoggerEnv -> LoggerEnv
addNamespace :: Text -> LoggerEnv -> LoggerEnv
addNamespace Text
ns LoggerEnv{LogAction IO Message
Seq Structured
context :: Seq Structured
action :: LogAction IO Message
context :: LoggerEnv -> Seq Structured
action :: LoggerEnv -> LogAction IO Message
..} = LoggerEnv :: LogAction IO Message -> Seq Structured -> LoggerEnv
LoggerEnv{context :: Seq Structured
context=Seq Structured
context Seq Structured -> Structured -> Seq Structured
forall a. Seq a -> a -> Seq a
Seq.|> Text -> Structured
Segment Text
ns, LogAction IO Message
action :: LogAction IO Message
action :: LogAction IO Message
..}
logDebug, logNotice, logInfo, logWarn,
logErr, logAlert, logCrit, logEmergency
:: MonadIO m => LoggerEnv -> LogStr -> m ()
logDebug :: LoggerEnv -> LogStr -> m ()
logDebug LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
DebugS
logNotice :: LoggerEnv -> LogStr -> m ()
logNotice LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
InfoS
logInfo :: LoggerEnv -> LogStr -> m ()
logInfo LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
InfoS
logWarn :: LoggerEnv -> LogStr -> m ()
logWarn LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
WarningS
logErr :: LoggerEnv -> LogStr -> m ()
logErr LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
ErrorS
logCrit :: LoggerEnv -> LogStr -> m ()
logCrit LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
CriticalS
logAlert :: LoggerEnv -> LogStr -> m ()
logAlert LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
AlertS
logEmergency :: LoggerEnv -> LogStr -> m ()
logEmergency LoggerEnv
x = LoggerEnv -> Severity -> LogStr -> m ()
forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
EmergencyS
logSay :: MonadIO m
=> LoggerEnv
-> Severity
-> LogStr
-> m ()
logSay :: LoggerEnv -> Severity -> LogStr -> m ()
logSay (LoggerEnv LogAction IO Message
action Seq Structured
context) Severity
lvl LogStr
msg = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
ThreadId
tid <- IO ThreadId
myThreadId
LogAction IO Message -> Message -> IO ()
forall (m :: * -> *) msg. LogAction m msg -> msg -> m ()
unLogAction LogAction IO Message
action (Message -> IO ()) -> Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Severity -> Int -> Seq Structured -> LogStr -> Message
Message Severity
lvl (ThreadId -> Int
mkThreadId ThreadId
tid) Seq Structured
context LogStr
msg
{-# SPECIALIZE logSay :: LoggerEnv -> Severity -> LogStr -> IO () #-}