@@ -2,20 +2,30 @@
3module Katip.Scribes.Handle
3module Katip.Scribes.Handle
4 ( mkHandleScribe
4 ( mkHandleScribe
5+ -- * exported for benchmarking
7-------------------------------------------------------------------------------
11-------------------------------------------------------------------------------
8import Blaze.ByteString.Builder
12import Blaze.ByteString.Builder
9import Blaze.ByteString.Builder.Char.Utf8
13import Blaze.ByteString.Builder.Char.Utf8
10import Control.Lens
14import Control.Lens
16+import qualified Data.String as S
11import Data.Aeson.Lens
17import Data.Aeson.Lens
12import qualified Data.ByteString.Char8 as B
18import qualified Data.ByteString.Char8 as B
13import qualified Data.HashMap.Strict as HM
19import qualified Data.HashMap.Strict as HM
14import Data.Monoid
20import Data.Monoid
21+import Data.Text.Lazy (pack, fromStrict, fromChunks)
22+import Data.Text.Lazy.Encoding
15import Data.Time
23import Data.Time
16import System.IO
24import System.IO
17import System.IO.Unsafe (unsafePerformIO)
25import System.IO.Unsafe (unsafePerformIO)
18import System.Locale
26import System.Locale
28+import qualified Text.PrettyPrint.Leijen.Text as PP
19-------------------------------------------------------------------------------
29-------------------------------------------------------------------------------
20import Katip.Core
30import Katip.Core
21-------------------------------------------------------------------------------
31-------------------------------------------------------------------------------
@@ -44,24 +54,59 @@ renderPrim NullPrim = fromByteString "null"
45-------------------------------------------------------------------------------
55-------------------------------------------------------------------------------
46mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
56mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
47−mkHandleScribe h sev verb = do
57+mkHandleScribe = mkHandleScribe' bbFormat
60+-------------------------------------------------------------------------------
61+mkHandleScribe' :: (forall a. LogContext a => Verbosity -> Item a -> Builder) -> Handle -> Severity -> Verbosity -> IO Scribe
62+mkHandleScribe' fmt h sev verb = do
48 hSetBuffering h LineBuffering
63 hSetBuffering h LineBuffering
49− return $ Scribe $ \ Item{..} -> do
64+ 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
65+ when (itemSeverity >= sev) $
62− then B.hPutStrLn h $ toByteString msg
66+ B.hPutStrLn h $ toByteString $ fmt verb i
69+-------------------------------------------------------------------------------
70+bbFormat verb Item{..} =
72+ brackets (mconcat $ map fromText $ intercalateNs itemNamespace) <>
73+ brackets (fromText (renderSeverity itemSeverity)) <>
74+ brackets (fromString itemHost) <>
75+ brackets (fromString (show itemProcess)) <>
76+ brackets (fromString (show itemThread)) <>
78+ maybe mempty (brackets . fromString . locationToString) itemLoc <>
79+ fromText " " <> fromText itemMessage
81+ nowStr = fromString $ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" itemTime
82+ ks = map brackets $ getKeys verb itemPayload
85+-------------------------------------------------------------------------------
86+colorFormat verb Item{..} = disp $
87+ PP.brackets (PP.string nowStr) <>
88+ PP.brackets (PP.string $ fromChunks $ intercalateNs itemNamespace) <>
89+ PP.brackets (PP.string $ fromStrict (renderSeverity' itemSeverity)) <>
90+ PP.brackets (PP.string $ pack itemHost) <>
91+ PP.brackets (PP.string $ pack (show itemProcess)) <>
92+ PP.brackets (PP.string $ pack (show itemThread)) <>
94+ maybe mempty (PP.brackets . S.fromString . locationToString) itemLoc <>
95+ PP.space <> PP.string (fromStrict itemMessage)
97+ disp = fromLazyByteString . encodeUtf8 . PP.displayT . PP.renderCompact
98+ nowStr = pack $ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" itemTime
99+ ks = map (PP.brackets . PP.string . decodeUtf8 . toLazyByteString) $ getKeys verb itemPayload
100+ renderSeverity' s = case s of
101+ Emergency -> red $ renderSeverity s
102+ Alert -> red $ renderSeverity s
103+ Critical -> red $ renderSeverity s
104+ Error -> red $ renderSeverity s
105+ Warning -> yellow $ renderSeverity s
106+ _ -> renderSeverity s
108+ yellow = colorize "33"
109+ colorize c s = "\ESC["<> c <> "m" <> s <> "\ESC[0m"
67-------------------------------------------------------------------------------
112-------------------------------------------------------------------------------