Skip to content

Commit a198a3e

Browse files
committed
cardano-tracer (maintenance): split up Journal implementation into internal modules
1 parent 5151313 commit a198a3e

File tree

4 files changed

+80
-65
lines changed

4 files changed

+80
-65
lines changed

cardano-tracer/cardano-tracer.cabal

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,10 @@ library
149149
Cardano.Tracer.Types
150150
Cardano.Tracer.Utils
151151

152-
other-modules: Cardano.Tracer.Handlers.Notifications.Timer
152+
other-modules: Cardano.Tracer.Handlers.Logs.Journal.NoSystemd
153+
Cardano.Tracer.Handlers.Notifications.Timer
153154
Paths_cardano_tracer
155+
154156
autogen-modules: Paths_cardano_tracer
155157

156158
if flag(rtview)
@@ -163,6 +165,7 @@ library
163165

164166
if flag(systemd) && os(linux)
165167
build-depends: libsystemd-journal >= 1.4.4
168+
other-modules: Cardano.Tracer.Handlers.Logs.Journal.Systemd
166169

167170
if (flag(systemd) && os(linux)) || flag(rtview)
168171
build-depends: unordered-containers
Lines changed: 3 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,11 @@
11
{-# LANGUAGE CPP #-}
2-
#ifdef SYSTEMD
3-
{-# LANGUAGE NamedFieldPuns #-}
4-
{-# LANGUAGE OverloadedStrings #-}
5-
{-# LANGUAGE ViewPatterns #-}
6-
#endif
72

83
module Cardano.Tracer.Handlers.Logs.Journal
9-
( writeTraceObjectsToJournal
4+
( module Impl
105
) where
116

127
#ifdef SYSTEMD
13-
import qualified Cardano.Logging as L
14-
#endif
15-
import Cardano.Logging (TraceObject (..))
16-
import Cardano.Tracer.Configuration (LogFormat (..))
17-
import Cardano.Tracer.Handlers.Utils (normalizeNamespace)
18-
import Cardano.Tracer.Types (NodeName)
19-
20-
#ifdef SYSTEMD
21-
import Data.Char (isDigit)
22-
import Data.Maybe (fromMaybe)
23-
import qualified Data.HashMap.Strict as HM
24-
import qualified Data.Text as T
25-
import Data.Text.Encoding (encodeUtf8)
26-
import Data.Time.Format (defaultTimeLocale, formatTime)
27-
28-
import Systemd.Journal (Priority (..), message, mkJournalField, priority,
29-
sendJournalFields, syslogIdentifier)
30-
31-
-- | Store 'TraceObject's in Linux systemd's journal service.
32-
writeTraceObjectsToJournal :: LogFormat -> NodeName -> [TraceObject] -> IO ()
33-
writeTraceObjectsToJournal logFormat nodeName =
34-
mapM_ (sendJournalFields . mkJournalFields)
35-
where
36-
-- when no forHuman message is implemented for a trace, fallback to forMachine (same as for file handler)
37-
getMsg :: TraceObject -> T.Text
38-
getMsg = case logFormat of
39-
ForMachine -> toMachine
40-
ForHuman -> \TraceObject{toHuman, toMachine} -> fromMaybe toMachine toHuman
41-
42-
mkJournalFields trObj@TraceObject{toSeverity, toNamespace, toThreadId, toTimestamp} =
43-
syslogIdentifier nodeName
44-
<> message (getMsg trObj)
45-
<> priority (mkPriority toSeverity)
46-
<> HM.fromList
47-
[ (namespace, encodeUtf8 $ mkName toNamespace)
48-
, (thread, encodeUtf8 $ T.filter isDigit toThreadId)
49-
, (time, encodeUtf8 $ formatAsIso8601 toTimestamp)
50-
]
51-
52-
mkName (normalizeNamespace -> ns) = if T.null ns then "noname" else ns
53-
54-
namespace = mkJournalField "namespace"
55-
thread = mkJournalField "thread"
56-
time = mkJournalField "time"
57-
58-
formatAsIso8601 = T.pack . formatTime defaultTimeLocale "%F %T%12QZ"
59-
60-
mkPriority L.Debug = Debug
61-
mkPriority L.Info = Info
62-
mkPriority L.Notice = Notice
63-
mkPriority L.Warning = Warning
64-
mkPriority L.Error = Error
65-
mkPriority L.Critical = Critical
66-
mkPriority L.Alert = Alert
67-
mkPriority L.Emergency = Emergency
8+
import Cardano.Tracer.Handlers.Logs.Journal.Systemd as Impl
689
#else
69-
-- It works only on Linux distributions with systemd support.
70-
writeTraceObjectsToJournal :: LogFormat -> NodeName -> [TraceObject] -> IO ()
71-
writeTraceObjectsToJournal _ _ _ = pure ()
10+
import Cardano.Tracer.Handlers.Logs.Journal.NoSystemd as Impl
7211
#endif
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Cardano.Tracer.Handlers.Logs.Journal.NoSystemd
2+
( writeTraceObjectsToJournal
3+
) where
4+
5+
import Cardano.Logging (TraceObject)
6+
import Cardano.Tracer.Configuration (LogFormat)
7+
import Cardano.Tracer.Types (NodeName)
8+
9+
10+
writeTraceObjectsToJournal :: LogFormat -> NodeName -> [TraceObject] -> IO ()
11+
writeTraceObjectsToJournal _ _ _ = pure ()
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{-# LANGUAGE NamedFieldPuns #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
{-# LANGUAGE ViewPatterns #-}
4+
5+
module Cardano.Tracer.Handlers.Logs.Journal.Systemd
6+
( writeTraceObjectsToJournal
7+
) where
8+
9+
import Cardano.Logging (TraceObject (..))
10+
import qualified Cardano.Logging as L
11+
import Cardano.Tracer.Configuration (LogFormat (..))
12+
import Cardano.Tracer.Handlers.Utils (normalizeNamespace)
13+
import Cardano.Tracer.Types (NodeName)
14+
15+
import Data.Char (isDigit)
16+
import qualified Data.HashMap.Strict as HM
17+
import Data.Maybe (fromMaybe)
18+
import qualified Data.Text as T
19+
import Data.Text.Encoding (encodeUtf8)
20+
import Data.Time.Format (defaultTimeLocale, formatTime)
21+
22+
import Systemd.Journal (Priority (..), message, mkJournalField, priority,
23+
sendJournalFields, syslogIdentifier)
24+
25+
26+
-- | Store 'TraceObject's in Linux systemd's journal service.
27+
writeTraceObjectsToJournal :: LogFormat -> NodeName -> [TraceObject] -> IO ()
28+
writeTraceObjectsToJournal logFormat nodeName =
29+
mapM_ (sendJournalFields . mkJournalFields)
30+
where
31+
-- when no forHuman message is implemented for a trace, fallback to forMachine (same as for file handler)
32+
getMsg :: TraceObject -> T.Text
33+
getMsg = case logFormat of
34+
ForMachine -> toMachine
35+
ForHuman -> \TraceObject{toHuman, toMachine} -> fromMaybe toMachine toHuman
36+
37+
mkJournalFields trObj@TraceObject{toSeverity, toNamespace, toThreadId, toTimestamp} =
38+
syslogIdentifier nodeName
39+
<> message (getMsg trObj)
40+
<> priority (mkPriority toSeverity)
41+
<> HM.fromList
42+
[ (namespace, encodeUtf8 $ mkName toNamespace)
43+
, (thread, encodeUtf8 $ T.filter isDigit toThreadId)
44+
, (time, encodeUtf8 $ formatAsIso8601 toTimestamp)
45+
]
46+
47+
mkName (normalizeNamespace -> ns) = if T.null ns then "noname" else ns
48+
49+
namespace = mkJournalField "namespace"
50+
thread = mkJournalField "thread"
51+
time = mkJournalField "time"
52+
53+
formatAsIso8601 = T.pack . formatTime defaultTimeLocale "%F %T%12QZ"
54+
55+
mkPriority L.Debug = Debug
56+
mkPriority L.Info = Info
57+
mkPriority L.Notice = Notice
58+
mkPriority L.Warning = Warning
59+
mkPriority L.Error = Error
60+
mkPriority L.Critical = Critical
61+
mkPriority L.Alert = Alert
62+
mkPriority L.Emergency = Emergency

0 commit comments

Comments
 (0)