@@ -8,6 +8,7 @@ module Katip.Scribes.Handle
88import Blaze.ByteString.Builder
99import Blaze.ByteString.Builder.Char.Utf8
1010import Control.Lens
11+import Control.Monad
1112import Data.Aeson.Lens
1213import qualified Data.ByteString.Char8 as B
1314import qualified Data.HashMap.Strict as HM
@@ -46,23 +47,40 @@ renderPrim NullPrim = fromByteString "null"
4647mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
4748mkHandleScribe h sev verb = do
4849 hSetBuffering h LineBuffering
49− return $ Scribe $ \ 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)) <>
58− mconcat ks <>
59− maybe mempty (brackets . fromString . locationToString) itemLoc <>
60− fromText " " <> fromText itemMessage
61− if itemSeverity >= sev
62− then B.putStrLn $ toByteString msg
63− else return ()
50+ colorize <- hIsTerminalDevice h
51+ return $ Scribe $ \ i@Item{..} -> do
52+ when (itemSeverity >= sev) $
53+ B.hPutStrLn h $ toByteString $ formatItem colorize verb i
6454
6555
56+-------------------------------------------------------------------------------
57+formatItem :: LogContext a => Bool -> Verbosity -> Item a -> Builder
58+formatItem withColor verb Item{..} =
59+ brackets nowStr <>
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)) <>
65+ mconcat ks <>
66+ maybe mempty (brackets . fromString . locationToString) itemLoc <>
67+ fromText " " <> fromText itemMessage
68+ where
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
78+ red = colorize "31"
79+ yellow = colorize "33"
80+ colorize c s
81+ | withColor = "\ESC["<> c <> "m" <> s <> "\ESC[0m"
82+ | otherwise = s
83+
6684
6785-------------------------------------------------------------------------------
6886-- | An implicit environment to enable logging directly ouf of the IO monad.
@@ -78,4 +96,3 @@ _ioLogEnv = unsafePerformIO $ do
7896-- | A default IO instance to make prototype development easy. User
7997-- your own 'Monad' for production.
8098instance Katip IO where getLogEnv = return _ioLogEnv
81−