@@ -18,6 +18,7 @@ import Control.AutoUpdate (UpdateSettings (..), defaultUpdateSettings,
1818import Control.Concurrent.MVar (modifyMVar_ )
1919
2020import Data.Aeson.Text (encodeToLazyText )
21+ import qualified Data.HashMap.Strict as HM
2122import qualified Data.Text as T
2223import Data.Text.Lazy.Builder
2324import qualified Data.Text.Lazy.IO as TIO
@@ -27,28 +28,31 @@ import Katip.Core
2728import Katip.Scribes.Handle (brackets )
2829
2930import qualified Pos.Util.Log.Internal as Internal
30- import Pos.Util.Log.LoggerConfig (RotationParameters (.. ))
31+ import Pos.Util.Log.LoggerConfig (NamedSeverity ,
32+ RotationParameters (.. ))
33+ import Pos.Util.Log.LoggerName (LoggerName )
3134import Pos.Util.Log.Rotator (cleanupRotator , evalRotator ,
3235 initializeRotator )
36+ import qualified Pos.Util.Log.Severity as Log (Severity (.. ))
3337
3438import System.IO (BufferMode (LineBuffering ), Handle ,
3539 IOMode (WriteMode ), hClose , hSetBuffering , stderr , stdout )
3640
3741-- | create a katip scribe for logging to a file in JSON representation
38- mkJsonFileScribe :: RotationParameters -> Internal. FileDescription -> Severity -> Verbosity -> IO Scribe
39- mkJsonFileScribe rot fdesc s v = do
40- mkFileScribe rot fdesc formatter False s v
42+ mkJsonFileScribe :: RotationParameters -> NamedSeverity -> Internal. FileDescription -> Log. Severity -> Verbosity -> IO Scribe
43+ mkJsonFileScribe rot sevfilter fdesc s v = do
44+ mkFileScribe rot sevfilter fdesc formatter False s v
4145 where
42- formatter :: LogItem a => Handle -> Bool -> Verbosity -> Item a -> IO Int
46+ formatter :: ( LogItem a ) => Handle -> Bool -> Verbosity -> Item a -> IO Int
4347 formatter hdl _ v' item = do
4448 let tmsg = encodeToLazyText $ itemJson v' item
4549 TIO. hPutStrLn hdl tmsg
4650 return $ length tmsg
4751
4852-- | create a katip scribe for logging to a file in textual representation
49- mkTextFileScribe :: RotationParameters -> Internal. FileDescription -> Bool -> Severity -> Verbosity -> IO Scribe
50- mkTextFileScribe rot fdesc colorize s v = do
51- mkFileScribe rot fdesc formatter colorize s v
53+ mkTextFileScribe :: RotationParameters -> NamedSeverity -> Internal. FileDescription -> Bool -> Log. Severity -> Verbosity -> IO Scribe
54+ mkTextFileScribe rot sevfilter fdesc colorize s v = do
55+ mkFileScribe rot sevfilter fdesc formatter colorize s v
5256 where
5357 formatter :: Handle -> Bool -> Verbosity -> Item a -> IO Int
5458 formatter hdl colorize' v' item = do
@@ -60,12 +64,13 @@ mkTextFileScribe rot fdesc colorize s v = do
6064-- and handle file rotation within the katip-invoked logging function
6165mkFileScribe
6266 :: RotationParameters
67+ -> NamedSeverity
6368 -> Internal. FileDescription
6469 -> (forall a . LogItem a => Handle -> Bool -> Verbosity -> Item a -> IO Int ) -- format and output function, returns written bytes
6570 -> Bool -- whether the output is colourized
66- -> Severity -> Verbosity
71+ -> Log. Severity -> Verbosity
6772 -> IO Scribe
68- mkFileScribe rot fdesc formatter colorize s v = do
73+ mkFileScribe rot sevfilter fdesc formatter colorize s v = do
6974 trp <- initializeRotator rot fdesc
7075 scribestate <- newMVar trp -- triple of (handle), (bytes remaining), (rotate time)
7176 -- sporadically remove old log files - every 10 seconds
@@ -77,7 +82,7 @@ mkFileScribe rot fdesc formatter colorize s v = do
7782 return (hdl, b, t)
7883 let logger :: forall a . LogItem a => Item a -> IO ()
7984 logger item =
80- when (permitItem s item) $
85+ when (checkItem s sevfilter item) $
8186 modifyMVar_ scribestate $ \ (hdl, bytes, rottime) -> do
8287 byteswritten <- formatter hdl colorize v item
8388 -- remove old files
@@ -97,38 +102,47 @@ mkFileScribe rot fdesc formatter colorize s v = do
97102 return $ Scribe logger finalizer
98103
99104-- | create a katip scribe for logging to a file
100- mkFileScribeH :: Handle -> Bool -> Severity -> Verbosity -> IO Scribe
101- mkFileScribeH h colorize s v = do
105+ mkFileScribeH :: Handle -> Bool -> NamedSeverity -> Log. Severity -> Verbosity -> IO Scribe
106+ mkFileScribeH h colorize sevfilter s v = do
102107 hSetBuffering h LineBuffering
103108 locklocal <- newMVar ()
104- let logger :: forall a . Item a -> IO ()
105- logger item = when (permitItem s item) $
109+ let logger :: Item a -> IO ()
110+ logger item = when (checkItem s sevfilter item) $
106111 bracket_ (takeMVar locklocal) (putMVar locklocal () ) $
107112 TIO. hPutStrLn h $! toLazyText $ formatItem colorize v item
108113 pure $ Scribe logger (hClose h)
109114
110115-- | create a katip scribe for logging to the console
111- mkStdoutScribe :: Severity -> Verbosity -> IO Scribe
116+ mkStdoutScribe :: NamedSeverity -> Log. Severity -> Verbosity -> IO Scribe
112117mkStdoutScribe = mkFileScribeH stdout True
113118
114119-- | create a katip scribe for logging to stderr
115- mkStderrScribe :: Severity -> Verbosity -> IO Scribe
120+ mkStderrScribe :: NamedSeverity -> Log. Severity -> Verbosity -> IO Scribe
116121mkStderrScribe = mkFileScribeH stderr True
117122
118123-- | @Scribe@ that outputs to '/dev/null' without locking
119- mkDevNullScribe :: Internal. LoggingHandler -> Severity -> Verbosity -> IO Scribe
120- mkDevNullScribe lh s v = do
124+ mkDevNullScribe :: Internal. LoggingHandler -> NamedSeverity -> Log. Severity -> Verbosity -> IO Scribe
125+ mkDevNullScribe lh sevfilter s v = do
121126 h <- openFile " /dev/null" WriteMode
122127 let colorize = False
123128 hSetBuffering h LineBuffering
124- let logger :: forall a . Item a -> IO ()
125- logger item = when (permitItem s item) $
129+ let logger :: Item a -> IO ()
130+ logger item = when (checkItem s sevfilter item) $
126131 Internal. incrementLinesLogged lh
127132 >> (TIO. hPutStrLn h $! toLazyText $ formatItem colorize v item)
128133 pure $ Scribe logger (hClose h)
129134
135+ -- | check if item passes severity filter
136+ checkItem :: Log. Severity -> NamedSeverity -> Item a -> Bool
137+ checkItem s sevfilter item@ Item {.. } =
138+ permitItem (Internal. sev2klog severity) item
139+ where
140+ severity :: Log. Severity
141+ severity = fromMaybe s $ HM. lookup namedcontext sevfilter
142+ namedcontext :: LoggerName
143+ namedcontext = mconcat $ intercalateNs _itemNamespace
130144
131- -- | format a @LogItem@ with subsecond precision (ISO 8601)
145+ -- | format a @Item@
132146formatItem :: Bool -> Verbosity -> Item a -> Builder
133147formatItem withColor _verb Item {.. } =
134148 fromText header <>
0 commit comments