-
Notifications
You must be signed in to change notification settings - Fork 10
/
README.md
151 lines (109 loc) · 4.37 KB
/
README.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
A fast & simple logging monad
=============================
[![Hackage](https://img.shields.io/hackage/v/monad-log.svg?style=flat-square)](http://hackage.haskell.org/package/monad-log)
[![Travis-CI](https://travis-ci.org/winterland1989/monad-log.svg?style=flat-square)](https://travis-ci.org/winterland1989/monad-log)
This package provide a mtl style `MonadLog` class and a concrete monad transformer `LogT`, the main difference between this package and monad-logger are:
+ Base monad has to be an instance of `MonadIO`.
+ Parametrized logging environment for extensibility.
+ Basic logging environment type(`Label`,`Loc`,`NameSpace`,`ThreadId`) are included, and you can easily make your own.
+ JSON logging built-in.
+ default to fast-logger backend, with good stdout and file support.
If you are an application author, you can use `LogT` transformer, a specialized reader monad to inject `Logger env`.
If you are a library author, you should:
+ make your monad stack an instance of 'MonadLog', usually you can do this by embedding `Logger env` into your monad's reader part.
+ provide a default formatter, and API to run with customized formatter.
Example
-------
+ A simple labelled logger:
```haskell
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad.Log
import Control.Monad.Log.Label
-- Following log will be output to stdout:
-- [INFO] [25-Apr-2016 12:51:56] [main] This is simple log 1
-- [INFO] [25-Apr-2016 12:51:56] [foo] This is simple log 2
main :: IO ()
main = do
logger <- makeDefaultLogger
simpleTimeFormat'
(LogStdout 4096)
levelDebug
(Label "main")
runLogTSafe logger $ do
info "This is simple log 1"
withLabel (Label "foo") $ do
info "This is simple log 2"
```
+ Logging with ThreadId:
```haskell
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad.Log
import Control.Monad.IO.Class
import Control.Monad
import Control.Concurrent
import Control.Monad.Log.LogThreadId
-- Following log will be output to stdout:
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 671] This is simple log 1
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 674] This is simple log 2
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 675] This is simple log 2
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 676] This is simple log 2
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 677] This is simple log 2
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 678] This is simple log 2
-- [INFO] [25-Apr-2016 15:06:10] [ThreadId 679] This is simple log 2
...
main :: IO ()
main = do
tid <- myLogThreadId
logger <- makeDefaultLogger
simpleTimeFormat'
(LogStdout 4096)
levelDebug
tid
runLogTSafe logger $ do
info "This is simple log 1"
replicateM_ 100 $
forkIO . runLogT' logger . withMyLogThreadId $ do
info "This is simple log 2"
```
+ Customized logging environment:
```haskell
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Control.Monad.Log
import Control.Monad.Log.LogLoc
import Control.Monad.Log.NameSpace
import Data.Aeson.TH
import Data.Text (Text)
-- Following JSON log will be output to stdout:
-- {"level":"INFO","time":"25-Apr-2016 13:54:32"
-- ,"env":{"loc":{"filename":"Test.hs","module":"Test","package":"monad_GM54RwU2jZ84vGJIhnMYMH","line":33},"ns":["root"]}
-- ,"msg":"This is simple log 1"}
-- {"level":"INFO","time":"25-Apr-2016 13:54:32"
-- ,"env":{"loc":{"filename":"Test.hs","module":"Test","package":"monad_GM54RwU2jZ84vGJIhnMYMH","line":33},"ns":["foo","root"]}
-- ,"msg":"This is simple log 2"}
-- | Define your logging environment type.
-- To use 'defaultFomatter', provide a 'TextShow' instance
-- To use 'defaultJSONFomatter', provide a 'ToJSON' instance
data MyEnv = MyEnv {
loc :: LogLoc -- This is shared by every log within one 'MonadLog'.
, ns :: NameSpace
} deriving (Show, Eq)
$(deriveJSON defaultOptions ''MyEnv)
subMyNS :: (MonadLog MyEnv m) => Text -> m a -> m a
subMyNS sub = localEnv $ \env -> env { ns = pushNameSpace sub (ns env) }
main :: IO ()
main = do
logger <- makeDefaultJSONLogger
simpleTimeFormat'
(LogStdout 4096)
levelDebug
(MyEnv $myLogLoc (NameSpace ["root"]))
runLogTSafe logger $ do
info "This is simple log 1"
subMyNS "foo" $ do
info "This is simple log 2"
```