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 (forall (m :: * -> *) msg. (msg -> m ()) -> LogAction m msg
LogAction forall a b. (a -> b) -> a -> b
$ \Message
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) 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 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) = forall (m :: * -> *) msg. (msg -> m ()) -> LogAction m msg
LogAction forall a b. (a -> b) -> a -> b
$ \(Severity
lvl, LogStr
msg) -> do
ThreadId
tid <- IO ThreadId
myThreadId
forall (m :: * -> *) msg. LogAction m msg -> msg -> m ()
unLogAction LogAction IO Message
action 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{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{context :: Seq Structured
context=Seq Structured
context 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 :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logDebug LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
DebugS
logNotice :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logNotice LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
NoticeS
logInfo :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logInfo LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
InfoS
logWarn :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logWarn LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
WarningS
logErr :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logErr LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
ErrorS
logCrit :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logCrit LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
CriticalS
logAlert :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logAlert LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
AlertS
logEmergency :: forall (m :: * -> *). MonadIO m => LoggerEnv -> LogStr -> m ()
logEmergency LoggerEnv
x = forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay LoggerEnv
x Severity
EmergencyS
logSay :: MonadIO m
=> LoggerEnv
-> Severity
-> LogStr
-> m ()
logSay :: forall (m :: * -> *).
MonadIO m =>
LoggerEnv -> Severity -> LogStr -> m ()
logSay (LoggerEnv LogAction IO Message
action Seq Structured
context) Severity
lvl LogStr
msg = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
ThreadId
tid <- IO ThreadId
myThreadId
forall (m :: * -> *) msg. LogAction m msg -> msg -> m ()
unLogAction LogAction IO Message
action 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 () #-}