log-base 0.10.0.1 → 0.11.0.0
raw patch · 7 files changed
+29/−7 lines, 7 filesdep ~aesonnew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson
API changes (from Hackage documentation)
+ Log.Class: localMaxLogLevel :: MonadLog m => LogLevel -> m a -> m a
+ Log.Data: defaultLogLevel :: LogLevel
+ Log.Data: readLogLevelEither :: Text -> Either String LogLevel
+ Log.Logger: [leMaxLogLevel] :: LoggerEnv -> LogLevel
+ Log.Monad: [leMaxLogLevel] :: LoggerEnv -> LogLevel
- Log.Logger: LoggerEnv :: !Logger -> !Text -> ![Text] -> ![Pair] -> LoggerEnv
+ Log.Logger: LoggerEnv :: !Logger -> !Text -> ![Text] -> ![Pair] -> LogLevel -> LoggerEnv
- Log.Monad: LoggerEnv :: !Logger -> !Text -> ![Text] -> ![Pair] -> LoggerEnv
+ Log.Monad: LoggerEnv :: !Logger -> !Text -> ![Text] -> ![Pair] -> LogLevel -> LoggerEnv
- Log.Monad: runLogT :: Text -> Logger -> LogT m a -> m a
+ Log.Monad: runLogT :: Text -> Logger -> LogLevel -> LogT m a -> m a
Files
- CHANGELOG.md +3/−0
- log-base.cabal +2/−2
- src/Log.hs +1/−1
- src/Log/Class.hs +3/−0
- src/Log/Data.hs +8/−0
- src/Log/Logger.hs +3/−2
- src/Log/Monad.hs +9/−2
CHANGELOG.md view
@@ -1,3 +1,6 @@+# log-base-0.11.0.0 (2021-10-11)+* Add support for defining maximum log level.+ # log-base-0.10.0.1 (2021-07-29) * Fix compilation issues caused by ambiguos occurence of `controlT`.
log-base.cabal view
@@ -1,5 +1,5 @@ name: log-base-version: 0.10.0.1+version: 0.11.0.0 synopsis: Structured logging solution (base package) description: A library that provides a way to record structured log@@ -40,7 +40,7 @@ Log.Logger, Log.Monad build-depends: base >= 4.9 && <5,- aeson >=0.11.0.0,+ aeson >=0.11.0.0 && <1.6, aeson-pretty >=0.8.2, bytestring, deepseq,
src/Log.hs view
@@ -18,7 +18,7 @@ -- esMapping = "log" -- } -- 'Log.Backend.ElasticSearch.withElasticSearchLogger' config randomIO $ \\logger -> do--- 'runLogT' "main" logger $ do+-- 'runLogT' "main" logger defaultLogLevel $ do -- 'logTrace_' "foo" -- @ module Log (
src/Log/Class.hs view
@@ -36,6 +36,8 @@ localData :: [Pair] -> m a -> m a -- | Extend the current application domain locally. localDomain :: T.Text -> m a -> m a+ -- | Override the current maximum log level.+ localMaxLogLevel :: LogLevel -> m a -> m a -- | Get current 'LoggerEnv' object. Useful for construction of logging -- functions that work in a different monad, see 'getLoggerIO' as an example. getLoggerEnv :: m LoggerEnv@@ -49,6 +51,7 @@ logMessage level message = lift . logMessage level message localData data_ m = controlT $ \run -> localData data_ (run m) localDomain domain m = controlT $ \run -> localDomain domain (run m)+ localMaxLogLevel level m = controlT $ \run -> localMaxLogLevel level (run m) getLoggerEnv = lift getLoggerEnv ----------------------------------------
src/Log/Data.hs view
@@ -3,8 +3,10 @@ LogLevel(..) , showLogLevel , readLogLevel+ , readLogLevelEither , LogMessage(..) , showLogMessage+ , defaultLogLevel ) where import Control.DeepSeq@@ -20,6 +22,8 @@ import qualified Data.Monoid as Monoid -- | Available log levels.+-- Note that ordering in this definintion determines what the maximum log level is.+-- See 'Log.Monad.leMaxLogLevel'. data LogLevel = LogAttention | LogInfo | LogTrace deriving (Bounded, Eq, Ord, Show) @@ -39,6 +43,10 @@ showLogLevel LogAttention = "attention" showLogLevel LogInfo = "info" showLogLevel LogTrace = "trace"++-- | The default log level. Returns `LogInfo`.+defaultLogLevel :: LogLevel+defaultLogLevel = LogInfo instance ToJSON LogLevel where toJSON = toJSON . showLogLevel
src/Log/Logger.hs view
@@ -32,6 +32,7 @@ , leDomain :: ![T.Text] -- ^ Current application domain. , leData :: ![A.Pair] -- ^ Additional data to be merged with the log -- message\'s data.+ , leMaxLogLevel :: LogLevel -- ^ The maximum log level allowed to be logged. } -- | Start a logger thread that consumes one queued message at a time.@@ -80,7 +81,7 @@ -- main = do -- logger \<- 'Log.Backend.ElasticSearch.elasticSearchLogger' -- a \<- 'Control.Concurrent.Async.async' ('Log.Backend.ElasticSearch.withElasticSearchLogger' $ \\logger ->--- 'Log.Monad.runLogT' "main" logger $ 'Log.Class.logTrace_' "foo")+-- 'Log.Monad.runLogT' "main" logger defaultLogLevel $ 'Log.Class.logTrace_' "foo") -- -- Main thread exits without waiting for the child -- -- to finish and without giving the child a chance -- -- to do proper cleanup.@@ -95,7 +96,7 @@ -- main = do -- logger \<- 'Log.Backend.ElasticSearch.elasticSearchLogger' -- a \<- 'Control.Concurrent.Async.async' ('Log.Backend.ElasticSearch.withElasticSearchLogger' $ \\logger ->--- 'Log.Monad.runLogT' "main" logger $ 'Log.Class.logTrace_' "foo")+-- 'Log.Monad.runLogT' "main" logger defaultLogLevel $ 'Log.Class.logTrace_' "foo") -- 'Control.Concurrent.Async.wait' a -- -- Main thread waits for the child to finish, giving -- -- it a chance to shut down properly. This works even
src/Log/Monad.hs view
@@ -54,13 +54,16 @@ -- for that. runLogT :: Text -- ^ Application component name to use. -> Logger -- ^ The logging back-end to use.+ -> LogLevel -- ^ The maximum log level allowed to be logged.+ -- Only messages less or equal than this level with be logged. -> LogT m a -- ^ The 'LogT' computation to run. -> m a-runLogT component logger m = runReaderT (unLogT m) LoggerEnv {+runLogT component logger maxLogLevel m = runReaderT (unLogT m) LoggerEnv { leLogger = logger , leComponent = component , leDomain = [] , leData = []+, leMaxLogLevel = maxLogLevel } -- We can't do synchronisation here, since 'runLogT' can be invoked -- quite often from the application (e.g. on every request). @@ -72,7 +75,8 @@ -- 'LoggerEnv'. Useful for reimplementation of 'MonadLog' instance. logMessageIO :: LoggerEnv -> UTCTime -> LogLevel -> Text -> Value -> IO () logMessageIO LoggerEnv{..} time level message data_ =- execLogger leLogger =<< E.evaluate (force lm)+ when (level <= leMaxLogLevel) $+ execLogger leLogger =<< E.evaluate (force lm) where lm = LogMessage { lmComponent = leComponent@@ -150,5 +154,8 @@ localDomain domain = LogT . local (\e -> e { leDomain = leDomain e ++ [domain] }) . unLogT++ localMaxLogLevel level =+ LogT . local (\e -> e { leMaxLogLevel = level }) . unLogT getLoggerEnv = LogT ask