on master help sign in
WIP colorizing

Need to check if the handle is TTY. Possibly provide an option or secondary export

commit4b43391f719daf1dfd3b2818fa8429fd57199f5b authorMichael Xavier <michael@michaelxavier.net> dateSun 1 Mar 2015, 14:15 (12 years ago) parent4957ae9
3 files changed+77−18
bench/Main.hs+15−2 katip.cabal+1 src/Katip/Scribes/Handle.hs+61−16
bench/Main.hs+15−2
@@ -34,6 +34,12 @@ handleScribeBench = standoff "Katip.Scribes.Handle" $ do
3434 tid <- liftIO myThreadId
3535 continue
3636 whnfIO $ push $ exItem tid
37+ subject "Colored" $ do
38+ pause
39+ (Scribe push) <- liftIO setupColor
40+ tid <- liftIO myThreadId
41+ continue
42+ whnfIO $ push $ exItem tid
3743
3844
3945-------------------------------------------------------------------------------
@@ -41,7 +47,7 @@ exItem :: ThreadId -> Item ExPayload
4147exItem tid = Item {
4248 itemApp = Namespace ["app"]
4349 , itemEnv = Environment "production"
44− , itemSeverity = Info
50+ , itemSeverity = Warning
4551 , itemThread = tid
4652 , itemHost = "example"
4753 , itemProcess = CPid 123
@@ -75,4 +81,11 @@ mkUTCTime y mt d h mn s = UTCTime day dt
7581setupBB :: IO Scribe
7682setupBB = do
7783 h <- openFile "/dev/null" WriteMode
78− mkHandleScribe h Debug V0
84+ mkHandleScribe' bbFormat h Debug V0
85+
86+
87+-------------------------------------------------------------------------------
88+setupColor :: IO Scribe
89+setupColor = do
90+ h <- openFile "/dev/null" WriteMode
91+ mkHandleScribe' colorFormat h Debug V0
katip.cabal+1
@@ -31,6 +31,7 @@ library
3131 build-depends:
3232 base >=4.6 && <4.7
3333 , aeson >=0.7 && <0.8
34+ , wl-pprint-text >= 1.1.0.3 && < 1.2
3435 , auto-update >= 0.1 && < 0.2
3536 , blaze-builder >= 0.3 && < 0.4
3637 , bytestring >= 0.9 && < 0.11
src/Katip/Scribes/Handle.hs+61−16
@@ -2,20 +2,30 @@
22
33module Katip.Scribes.Handle
44 ( mkHandleScribe
5+ -- * exported for benchmarking
6+ , mkHandleScribe'
7+ , bbFormat
8+ , colorFormat
59 ) where
610
711-------------------------------------------------------------------------------
812import Blaze.ByteString.Builder
913import Blaze.ByteString.Builder.Char.Utf8
1014import Control.Lens
15+import Control.Monad
16+import qualified Data.String as S
1117import Data.Aeson.Lens
1218import qualified Data.ByteString.Char8 as B
1319import qualified Data.HashMap.Strict as HM
1420import Data.Monoid
21+import Data.Text.Lazy (pack, fromStrict, fromChunks)
22+import Data.Text.Lazy.Encoding
1523import Data.Time
1624import System.IO
1725import System.IO.Unsafe (unsafePerformIO)
1826import System.Locale
27+
28+import qualified Text.PrettyPrint.Leijen.Text as PP
1929-------------------------------------------------------------------------------
2030import Katip.Core
2131-------------------------------------------------------------------------------
@@ -44,24 +54,59 @@ renderPrim NullPrim = fromByteString "null"
4454
4555-------------------------------------------------------------------------------
4656mkHandleScribe :: Handle -> Severity -> Verbosity -> IO Scribe
47−mkHandleScribe h sev verb = do
57+mkHandleScribe = mkHandleScribe' bbFormat
58+
59+
60+-------------------------------------------------------------------------------
61+mkHandleScribe' :: (forall a. LogContext a => Verbosity -> Item a -> Builder) -> Handle -> Severity -> Verbosity -> IO Scribe
62+mkHandleScribe' fmt h sev verb = do
4863 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.hPutStrLn h $ toByteString msg
63− else return ()
64+ return $ Scribe $ \ i@Item{..} -> do
65+ when (itemSeverity >= sev) $
66+ B.hPutStrLn h $ toByteString $ fmt verb i
67+
6468
69+-------------------------------------------------------------------------------
70+bbFormat verb Item{..} =
71+ brackets nowStr <>
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)) <>
77+ mconcat ks <>
78+ maybe mempty (brackets . fromString . locationToString) itemLoc <>
79+ fromText " " <> fromText itemMessage
80+ where
81+ nowStr = fromString $ formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" itemTime
82+ ks = map brackets $ getKeys verb itemPayload
83+
84+
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)) <>
93+ mconcat ks <>
94+ maybe mempty (PP.brackets . S.fromString . locationToString) itemLoc <>
95+ PP.space <> PP.string (fromStrict itemMessage)
96+ where
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
107+ red = colorize "31"
108+ yellow = colorize "33"
109+ colorize c s = "\ESC["<> c <> "m" <> s <> "\ESC[0m"
65110
66111
67112-------------------------------------------------------------------------------