* Overview
  Lager (as in the beer) is a logging framework for Erlang. Its purpose is
  to provide a more traditional way to perform logging in an erlang application
  that plays nicely with traditional UNIX logging tools like logrotate and
  syslog.

*  Features
    - Finer grained log levels (debug, info, notice, warning, error, critical,
      alert, emergency)
    - Logger calls are transformed using a parse transform to allow capturing
      Module/Function/Line/Pid information
    - When no handler is consuming a log level (eg. debug) no event is even sent
      to the log handler
    - Supports multiple backends, including console and file. More are planned.

* Usage
  To use lager in your application, you need to define it as a rebar dep or have
  some other way of including it in erlang's path. You can then add the
  following option to the erlang compiler flags

#+BEGIN_EXAMPLE
  {parse_transform, lager_transform}
#+END_EXAMPLE

  Alternately, you can add it to the module you wish to compile with logging
  enabled:

#+BEGIN_EXAMPLE
  -compile([{parse_transform, lager_transform}]).
#+END_EXAMPLE

  Once you have built your code with lager, you can then generate log messages
  by doing the following:

#+BEGIN_EXAMPLE
  lager:error("Some message")
#+END_EXAMPLE

  Or:

#+BEGIN_EXAMPLE
  lager:warning("Some message with a term: ~p", [Term])
#+END_EXAMPLE

  The general form is lager:Severity() where Severity is one of the log levels
  mentioned above.

* Configuration
  To configure lager's backends, you use an application variable (probably in
  your app.config):

#+BEGIN_EXAMPLE
  {lager,
    {handlers, [
      {lager_console_backend, info},
      {lager_file_backend, [{"error.log", error}, {"console.log", info}]}
    ]}
  }.
#+END_EXAMPLE

  The available configuration options for each backend are listed in their
  module's documentation.

* Error logger integration
  Lager is also supplied with a error_logger handler module that translates
  traditional erlang error messages into a friendlier format and sends them into
  lager itself to be treated like a regular lager log call. To disable this, set
  the lager application variable `error_logger_redirect' to `false'.

  The error_logger handler will also log more complete error messages (protected
  with use of trunc_io) to a "crash log" which can be referred to for further
  information. The location of the crash log can be specified by the crash_log
  application variable. If undefined it is not written at all.

* Runtime loglevel changes
  You can change the log level of any lager backend at runtime by doing the
  following:

#+BEGIN_EXAMPLE
  lager:set_loglevel(lager_console_backend, debug).
#+END_EXAMPLE

  Or, for the backend with multiple handles (files, mainly):

#+BEGIN_EXAMPLE
  lager:set_loglevel(lager_file_backend, "console.log" debug).
#+END_EXAMPLE

  Lager keeps track of the minium log level being used by any backend and
  supresses generation of messages lower than that level. This means that debug
  log messages, when no backend is consuming debug messages, are effectively
  free. A simple benchmark of doing 1 million debug log messages while the
  minimum threshold was above that takes less than half a second.