@@ -8,6 +8,7 @@ module Katip.Scribes.Handle
8import Blaze.ByteString.Builder
8import Blaze.ByteString.Builder
9import Blaze.ByteString.Builder.Char.Utf8
9import Blaze.ByteString.Builder.Char.Utf8
10import Control.Lens
10import Control.Lens
11import Data.Aeson.Lens
12import Data.Aeson.Lens
12import qualified Data.ByteString.Char8 as B
13import qualified Data.ByteString.Char8 as B
13import qualified Data.HashMap.Strict as HM
14import qualified Data.HashMap.Strict as HM
@@ -46,23 +47,40 @@ renderPrim NullPrim = fromByteString "null"
46mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
47mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
47mkHandleScribe h sev verb = do
48mkHandleScribe h sev verb = do
48 hSetBuffering h LineBuffering
49 hSetBuffering h LineBuffering
50+ colorize <- hIsTerminalDevice h
49− return $ Scribe $ \ Item{..} -> do
51+ return $ Scribe $ \ i@Item{..} -> do
50− let nowStr = fromString $ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" itemTime
51− ks = map brackets $ getKeys verb itemPayload
52− msg = brackets nowStr <>
53− brackets (mconcat $ map fromText $ intercalateNs itemNamespace) <>
54− brackets (fromText (renderSeverity itemSeverity)) <>
55− brackets (fromString itemHost) <>
56− brackets (fromString (show itemProcess)) <>
57− brackets (fromString (show itemThread)) <>
59− maybe mempty (brackets . fromString . locationToString) itemLoc <>
60− fromText " " <> fromText itemMessage
61− if itemSeverity >= sev
52+ when (itemSeverity >= sev) $
62− then B.putStrLn $ toByteString msg
53+ B.hPutStrLn h $ toByteString $ formatItem colorize verb i
56+-------------------------------------------------------------------------------
57+formatItem :: LogContext a => Bool -> Verbosity -> Item a -> Builder
58+formatItem withColor verb Item{..} =
60+ brackets (mconcat $ map fromText $ intercalateNs itemNamespace) <>
61+ brackets (fromText (renderSeverity' itemSeverity)) <>
62+ brackets (fromString itemHost) <>
63+ brackets (fromString (show itemProcess)) <>
64+ brackets (fromString (show itemThread)) <>
66+ maybe mempty (brackets . fromString . locationToString) itemLoc <>
67+ fromText " " <> fromText itemMessage
69+ nowStr = fromString $ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" itemTime
70+ ks = map brackets $ getKeys verb itemPayload
71+ renderSeverity' s = case s of
72+ Emergency -> red $ renderSeverity s
73+ Alert -> red $ renderSeverity s
74+ Critical -> red $ renderSeverity s
75+ Error -> red $ renderSeverity s
76+ Warning -> yellow $ renderSeverity s
77+ _ -> renderSeverity s
79+ yellow = colorize "33"
81+ | withColor = "\ESC["<> c <> "m" <> s <> "\ESC[0m"
67-------------------------------------------------------------------------------
85-------------------------------------------------------------------------------
68-- | An implicit environment to enable logging directly ouf of the IO monad.
86-- | An implicit environment to enable logging directly ouf of the IO monad.
@@ -78,4 +96,3 @@ _ioLogEnv = unsafePerformIO $ do
78-- | A default IO instance to make prototype development easy. User
96-- | A default IO instance to make prototype development easy. User
79-- your own 'Monad' for production.
97-- your own 'Monad' for production.
80instance Katip IO where getLogEnv = return _ioLogEnv
98instance Katip IO where getLogEnv = return _ioLogEnv