-- | Enrich 'LogMessage's with timestamps and OS dependent information. module Control.Eff.LogWriter.Rich ( richLogWriter , withRichLogging , stdoutLogWriter ) where import Control.Eff as Eff import Control.Eff.Log import Control.Monad ( (>=>) ) import Control.Lens (set) import Data.Text -- | Enable logging to IO using the 'richLogWriter'. -- -- Example: -- -- > exampleWithIoLogging :: IO () -- > exampleWithIoLogging = -- > runLift -- > $ withRichLogging debugTraceLogWriter -- > "my-app" -- > local7 -- > (lmSeverityIsAtLeast informationalSeverity) -- > $ logInfo "Oh, hi there" -- withRichLogging :: Lifted IO e => LogWriter -- ^ The 'LogWriter' that will be used to write log messages. -> Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates" -> Eff (Logs : LogWriterReader : e) a -> Eff e a withRichLogging lw appName facility defaultPredicate = withLogging (richLogWriter appName facility lw) . setLogPredicate defaultPredicate -- | Decorate an IO based 'LogWriter' to fill out these fields in 'LogMessage's: -- -- * The messages will carry the given application name in the 'lmAppName' field. -- * The 'lmTimestamp' field contains the UTC time of the log event -- * The 'lmHostname' field contains the FQDN of the current host -- * The 'lmFacility' field contains the given 'Facility' -- -- It works by using 'mappingLogWriterIO'. richLogWriter :: Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogWriter -- ^ The IO based writer to decorate -> LogWriter richLogWriter appName facility = mappingLogWriterIO ( setLogMessageTimestamp >=> setLogMessageHostname ) . mappingLogWriter ( set lmFacility facility . set lmAppName (Just appName) )