Copyright | (c) Dong Han 2017-2018 |
---|---|
License | BSD |
Maintainer | winterland1989@gmail.com |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Simple, high performance logger. The design choice of this logger is biased towards simplicity instead of generlization:
- All log functions lives in
IO
. - By default this logger is connected to stderr, use
setStdLogger
to customize. - When logging each thread will build log
Builder
s into a smallBytes
with line buffer instead of leaving allBuilder
s to the flushing thread: - Logger won't keep heap data for too long simply because they're referenced by log's
Builder
. - Each logging thread only need perform a CAS to prepend log
Bytes
into a list, which reduces contention. - Each log call is atomic, Logging order is preserved under concurrent settings.
Flushing is automatic and throttled for debug
, info
, warn
to boost performance, but a fatal
log will always flush logger's buffer. This could lead to a problem that if main thread exits too early logs may missed, to add a flushing when program exits, use withStdLogger
like:
import Z.IO.Logger main :: IO () main = withStdLogger $ do .... debug "..." -- So that this log won't be missed ...
Synopsis
- data Logger = Logger {
- loggerPushBuilder :: Builder () -> IO ()
- flushLogger :: IO ()
- flushLoggerThrottled :: IO ()
- loggerTSCache :: IO (Maybe (Builder ()))
- loggerFmt :: LogFormatter
- data LoggerConfig = LoggerConfig {}
- setStdLogger :: Logger -> IO ()
- getStdLogger :: IO Logger
- withStdLogger :: IO () -> IO ()
- newLogger :: Output o => LoggerConfig -> MVar (BufferedOutput o) -> IO Logger
- debug :: HasCallStack => Builder () -> IO ()
- info :: HasCallStack => Builder () -> IO ()
- warn :: HasCallStack => Builder () -> IO ()
- fatal :: HasCallStack => Builder () -> IO ()
- otherLevel :: HasCallStack => Builder () -> Bool -> Builder () -> IO ()
- debugTo :: HasCallStack => Logger -> Builder () -> IO ()
- infoTo :: HasCallStack => Logger -> Builder () -> IO ()
- warnTo :: HasCallStack => Logger -> Builder () -> IO ()
- fatalTo :: HasCallStack => Logger -> Builder () -> IO ()
- otherLevelTo :: HasCallStack => Logger -> Builder () -> Bool -> Builder () -> IO ()
- defaultTSCache :: IO (Builder ())
- defaultFmtCallStack :: CallStack -> Builder ()
- type LogFormatter = Maybe (Builder ()) -> Builder () -> Builder () -> CallStack -> Builder ()
- defaultFmt :: Bool -> LogFormatter
- flushLog :: (HasCallStack, Output o) => MVar (BufferedOutput o) -> IORef [Bytes] -> IO ()
A simple Logger type
Logger | |
|
data LoggerConfig Source #
LoggerConfig | |
|
setStdLogger :: Logger -> IO () Source #
Change the global logger.
getStdLogger :: IO Logger Source #
Get the global logger.
withStdLogger :: IO () -> IO () Source #
Flush stderr logger when program exits.
newLogger :: Output o => LoggerConfig -> MVar (BufferedOutput o) -> IO Logger Source #
Make a new simple logger.
logging functions
:: HasCallStack | |
=> Builder () | log level |
-> Bool | flush immediately? |
-> Builder () | log content |
-> IO () |
logging functions with specific logger
Helper to write new logger
defaultTSCache :: IO (Builder ()) Source #
A default timestamp cache with format %Y-%m-%dT%H:%M:%S%Z
The timestamp will updated in 0.1s granularity to ensure a seconds level precision.
defaultFmtCallStack :: CallStack -> Builder () Source #
Default stack formatter which fetch the logging source and location.
type LogFormatter Source #
:: Bool | show call stack info? |
-> LogFormatter |
A default log formatter
[DEBUG][2020-10-09T07:44:14UTC][interactive:7:1]This a debug message