-
Notifications
You must be signed in to change notification settings - Fork 111
Expand file tree
/
Copy pathLogging.hs
More file actions
95 lines (86 loc) · 2.36 KB
/
Copy pathLogging.hs
File metadata and controls
95 lines (86 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE UndecidableInstances #-}
-- | Adapter module to the actual logging framework. For now we are using the
-- iohk-monitoring package, but that might change soon.
module Hydra.Logging (
-- * Tracer
Tracer,
natTracer,
nullTracer,
contramap,
traceWith,
traceInTVar,
LoggerName,
-- * Using it
Verbosity (..),
withTracer,
) where
import Cardano.BM.Backend.Switchboard (
Switchboard,
)
import Cardano.BM.Configuration.Static (
defaultConfigStdout,
)
import Cardano.BM.Data.LogItem (
LOContent (..),
LogObject (..),
LoggerName,
PrivacyAnnotation (..),
mkLOMeta,
)
import Cardano.BM.Data.Severity (
Severity (..),
)
import Cardano.BM.Setup (
setupTrace_,
shutdown,
)
import Cardano.Prelude hiding (atomically)
import Control.Tracer (
Tracer (..),
contramap,
natTracer,
nullTracer,
traceWith,
)
import qualified Cardano.BM.Configuration.Model as CM
import qualified Cardano.BM.Data.BackendKind as CM
import Control.Monad.Class.MonadSTM (MonadSTM (atomically), TVar, modifyTVar)
data Verbosity = Quiet | Verbose LoggerName
deriving (Eq, Show)
-- | Acquire a tracer that automatically shutdown once the action is done via
-- bracket-style allocation.
withTracer ::
forall m msg a.
MonadIO m =>
Verbosity ->
(msg -> Text) ->
(Tracer m msg -> IO a) ->
IO a
withTracer Quiet _ between = between nullTracer
withTracer (Verbose name) transform between = do
bracket before after (between . natTracer liftIO . fst)
where
before :: IO (Tracer IO msg, Switchboard Text)
before = do
config <- defaultConfigStdout
CM.setSetupBackends config [CM.KatipBK]
(tr, sb) <- setupTrace_ config name
pure (transformLogObject transform tr, sb)
after :: (Tracer IO msg, Switchboard Text) -> IO ()
after = shutdown . snd
-- | Tracer transformer which converts 'Trace m a' to 'Tracer m a' by wrapping
-- typed log messages into a 'LogObject'. NOTE: All log messages are of severity
-- 'Debug'.
transformLogObject ::
MonadIO m =>
(msg -> Text) ->
Tracer m (LoggerName, LogObject Text) ->
Tracer m msg
transformLogObject transform tr = Tracer $ \a -> do
traceWith tr . (mempty,) =<< LogObject mempty
<$> mkLOMeta Debug Public
<*> pure (LogMessage (transform a))
traceInTVar :: MonadSTM m => TVar m [a] -> Tracer m a
traceInTVar tvar = Tracer $ \a ->
atomically $ modifyTVar tvar (a :)