tinylog 0.10.5 → 0.12.0
raw patch · 4 files changed
+101/−31 lines, 4 filesdep +containersdep ~criterion
Dependencies added: containers
Dependency ranges changed: criterion
Files
- CHANGELOG.md +5/−0
- src/System/Logger.hs +53/−15
- src/System/Logger/Settings.hs +40/−14
- tinylog.cabal +3/−2
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.12.0+-----------------------------------------------------------------------------+- Add support for logger-specific log-levels.+- Changed logger `name` in settings to `Maybe Text`.+ 0.10 ----------------------------------------------------------------------------- - Introduce `Settings` module.
src/System/Logger.hs view
@@ -2,15 +2,19 @@ -- License, v. 2.0. If a copy of the MPL was not distributed with this -- file, You can obtain one at http://mozilla.org/MPL/2.0/. +{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-} -- | Small layer on top of @fast-logger@ which adds log-levels and--- timestamp support (using @date-cache@) and not much more.+-- timestamp support and not much more. module System.Logger- ( Settings+ ( -- * Settings+ Settings , defSettings , logLevel , setLogLevel+ , logLevelOf+ , setLogLevelOf , output , setOutput , format@@ -24,13 +28,14 @@ , name , setName - , Level (..)- , Output (..)-+ -- * Type definitions+ , Logger+ , Level (..)+ , Output (..) , DateFormat , iso8601UTC - , Logger+ -- * Core API , new , create , level@@ -39,6 +44,7 @@ , clone , settings + -- ** Logging , log , trace , debug@@ -62,6 +68,7 @@ import System.Logger.Message as M import System.Logger.Settings +import qualified Data.Map.Strict as Map import qualified System.Log.FastLogger as FL data Logger = Logger@@ -75,15 +82,38 @@ -- the environment variable @LOG_LEVEL@ accordingly. Likewise the buffer -- size can be dynamically set via @LOG_BUFFER@ and netstrings encoding -- can be enabled with @LOG_NETSTR=True@+--+-- Since version 0.11 one can also use @LOG_LEVEL_MAP@ to specify log+-- levels per (named) logger. The syntax uses standard haskell syntax for+-- association lists of type @[(Text, Level)]@. For example:+--+-- @+-- $ LOG_LEVEL=Info LOG_LEVEL_MAP='[("foo", Warn), ("bar", Trace)]' cabal repl+-- > g1 <- new defSettings+-- > let g2 = clone (Just "foo") g+-- > let g3 = clone (Just "bar") g+-- > let g4 = clone (Just "xxx") g+-- > logLevel (settings g1)+-- Info+-- > logLevel (settings g2)+-- Warn+-- > logLevel (settings g3)+-- Trace+-- > logLevel (settings g4)+-- Info+-- @ new :: MonadIO m => Settings -> m Logger new s = liftIO $ do- n <- fmap (readNote "Invalid LOG_BUFFER") <$> lookupEnv "LOG_BUFFER"- l <- fmap (readNote "Invalid LOG_LEVEL") <$> lookupEnv "LOG_LEVEL"- e <- fmap (readNote "Invalid LOG_NETSTR") <$> lookupEnv "LOG_NETSTR"+ !n <- fmap (readNote "Invalid LOG_BUFFER") <$> lookupEnv "LOG_BUFFER"+ !l <- fmap (readNote "Invalid LOG_LEVEL") <$> lookupEnv "LOG_LEVEL"+ !e <- fmap (readNote "Invalid LOG_NETSTR") <$> lookupEnv "LOG_NETSTR"+ !m <- fromMaybe "[]" <$> lookupEnv "LOG_LEVEL_MAP"+ let !k = logLevelMap s `mergeWith` m+ let !s' = setLogLevel (fromMaybe (logLevel s) l)+ . setNetStrings (fromMaybe (netstrings s) e)+ . setLogLevelMap k+ $ s g <- fn (output s) (fromMaybe (bufSize s) n)- let s' = setLogLevel (fromMaybe (logLevel s) l)- . setNetStrings (fromMaybe (netstrings s) e)- $ s Logger g s' <$> mkGetDate (format s) where fn StdOut = FL.newStdoutLoggerSet@@ -94,6 +124,8 @@ mkGetDate f = mkAutoUpdate defaultUpdateSettings { updateAction = msg . formatUnixTimeGMT (template f) <$> getUnixTime } + mergeWith m e = Map.fromList (readNote "Invalid LOG_LEVEL_MAP" e) `Map.union` m+ -- | Invokes 'new' with default settings and the given output as log sink. create :: MonadIO m => Output -> m Logger create o = new $ setOutput o defSettings@@ -125,10 +157,16 @@ {-# INLINE fatal #-} -- | Clone the given logger and optionally give it a name--- (use @(Just \"\")@ to clear).+-- (use @Nothing@ to clear).+--+-- If 'logLevelOf' returns a custom 'Level' for this name+-- then the cloned logger will use it for its log messages. clone :: Maybe Text -> Logger -> Logger-clone (Just n) g = g { settings = setName n (settings g) }-clone Nothing g = g+clone Nothing g = g { settings = setName Nothing (settings g) }+clone (Just n) g =+ let s = settings g+ l = fromMaybe (logLevel s) $ logLevelOf n s+ in g { settings = setName (Just n) . setLogLevel l $ s } -- | Force buffered bytes to output sink. flush :: MonadIO m => Logger -> m ()
src/System/Logger/Settings.hs view
@@ -22,7 +22,11 @@ , netstrings , setNetStrings , logLevel+ , logLevelMap+ , logLevelOf , setLogLevel+ , setLogLevelMap+ , setLogLevelOf , name , setName , nameMsg@@ -32,19 +36,21 @@ import Data.String import Data.ByteString (ByteString) import Data.ByteString.Char8 (pack)+import Data.Map.Strict as Map import Data.Text (Text) import System.Log.FastLogger (defaultBufSize) import System.Logger.Message data Settings = Settings- { _logLevel :: !Level -- ^ messages below this log level will be suppressed- , _output :: !Output -- ^ log sink- , _format :: !DateFormat -- ^ the timestamp format (use \"\" to disable timestamps)- , _delimiter :: !ByteString -- ^ text to intersperse between fields of a log line- , _netstrings :: !Bool -- ^ use <http://cr.yp.to/proto/netstrings.txt netstrings> encoding (fixes delimiter to \",\")- , _bufSize :: !Int -- ^ how many bytes to buffer before commiting to sink- , _name :: !Text -- ^ logger name- , _nameMsg :: Msg -> Msg+ { _logLevel :: !Level -- ^ messages below this log level will be suppressed+ , _levelMap :: !(Map Text Level) -- ^ log level per named logger+ , _output :: !Output -- ^ log sink+ , _format :: !DateFormat -- ^ the timestamp format (use \"\" to disable timestamps)+ , _delimiter :: !ByteString -- ^ text to intersperse between fields of a log line+ , _netstrings :: !Bool -- ^ use <http://cr.yp.to/proto/netstrings.txt netstrings> encoding (fixes delimiter to \",\")+ , _bufSize :: !Int -- ^ how many bytes to buffer before commiting to sink+ , _name :: !(Maybe Text) -- ^ logger name+ , _nameMsg :: !(Msg -> Msg) } output :: Settings -> Output@@ -53,6 +59,7 @@ setOutput :: Output -> Settings -> Settings setOutput x s = s { _output = x } +-- | The time and date format used for the timestamp part of a log line. format :: Settings -> DateFormat format = _format @@ -65,12 +72,15 @@ setBufSize :: Int -> Settings -> Settings setBufSize x s = s { _bufSize = max 1 x } +-- | Delimiter string which separates log line parts. delimiter :: Settings -> ByteString delimiter = _delimiter setDelimiter :: ByteString -> Settings -> Settings setDelimiter x s = s { _delimiter = x } +-- | Whether to use <http://cr.yp.to/proto/netstrings.txt netstring>+-- encoding for log lines. netstrings :: Settings -> Bool netstrings = _netstrings @@ -83,12 +93,28 @@ setLogLevel :: Level -> Settings -> Settings setLogLevel x s = s { _logLevel = x } -name :: Settings -> Text+-- | Log level of some named logger.+logLevelOf :: Text -> Settings -> Maybe Level+logLevelOf x s = Map.lookup x (_levelMap s)++logLevelMap :: Settings -> Map Text Level+logLevelMap = _levelMap++-- | Specify a log level for the given named logger. When a logger is+-- 'clone'd and given a name, the 'logLevel' of the cloned logger will be+-- the provided here.+setLogLevelOf :: Text -> Level -> Settings -> Settings+setLogLevelOf n x s = s { _levelMap = Map.insert n x (_levelMap s) }++setLogLevelMap :: Map Text Level -> Settings -> Settings+setLogLevelMap x s = s { _levelMap = x }++name :: Settings -> Maybe Text name = _name -setName :: Text -> Settings -> Settings-setName "" s = s { _name = "", _nameMsg = id }-setName xs s = s { _name = xs, _nameMsg = "logger" .= xs }+setName :: Maybe Text -> Settings -> Settings+setName Nothing s = s { _name = Nothing, _nameMsg = id }+setName (Just xs) s = s { _name = Just xs, _nameMsg = "logger" .= xs } nameMsg :: Settings -> (Msg -> Msg) nameMsg = _nameMsg@@ -133,8 +159,8 @@ -- -- * 'bufSize' = 'FL.defaultBufSize' ----- * 'name' = \"\"+-- * 'name' = Nothing -- defSettings :: Settings-defSettings = Settings Debug StdOut iso8601UTC ", " False defaultBufSize "" id+defSettings = Settings Debug Map.empty StdOut iso8601UTC ", " False defaultBufSize Nothing id
tinylog.cabal view
@@ -1,5 +1,5 @@ name: tinylog-version: 0.10.5+version: 0.12.0 synopsis: Simplistic logging using fast-logger. author: Toralf Wittner maintainer: Toralf Wittner <tw@dtex.org>@@ -38,6 +38,7 @@ base == 4.* , bytestring >= 0.10.4 && < 1.0 , auto-update >= 0.1 && < 0.2+ , containers >= 0.5 , double-conversion >= 0.2 && < 3.0 , fast-logger >= 2.1.4 && < 2.3 , text >= 0.11 && < 2.0@@ -53,5 +54,5 @@ build-depends: base == 4.* , bytestring- , criterion >= 1.0.0.2 && < 2.0+ , criterion >= 1.0.0.2 , tinylog