This library provides a class for monads which can log messages, and an
associated monad transformer. It also includes associated data types and
utilities, like a
Message type, log filters, and formatters. It's roughly
inspired by http://hackage.haskell.org/package/monad-logger.
See doc/Example.purs for an example of how to use this library.
Say you have a function that returns an effect to calculate a string:
doSomething :: forall m. MonadEffect m => m String doSomething = pure "foobar!"
You can add logging to it by doing something like this:
doSomethingWithLog :: forall m. MonadLogger m => MonadEffect m => m String doSomethingWithLog = do debug empty "About to do something!" result <- doSomething debug (tag "Result" result) "Did the thing!" pure result
To resolve the logger context, pass a log handler to
runLoggedStuff:: forall m. MonadEffect m => m String runLoggedStuff = runLoggerT doSomethingWithLog $ prettyFormatter >=> Console.log
Log levels are defined in Data.Log.Level. For each
level, there is an associated function in
Control.Monad.Logger.Class which will
generate a timestamped
Message of that level and pass it onto the log handler.
You can add various metadata to your log lines by using tags. You can generate tags of various types by using the functions exported from Data.Log.Tag.
A log handler is just a function with the signature:
forall m. MonadEffect m => Message -> m Unit
MonadEffect constraint is required, even if you don't do anything
effectual with your log handler, because this library generates timestamps for
Typically you will create a log handler by passing log messages through a
formatter and to something like
Console.log. Sometimes you might want to add
a message filter, if you don't want to deliver all logs to a particular target.
Message payloads to strings. There are two formatters built
- Data.Log.Formatter.Pretty: generates beautiful, asci-colored strings, appropriate for a developer console log
- Data.Log.Formatter.JSON: generates compact JSON strings, appropriate for log files or piping logs through an external tool for processing
Filters are used, as the name implies, to only pass through certain messages to handler. Built-in formatters are available in Data.Log.Filter and can be used to filter messages out by log level.