Awesome
LoggerLagerBackend
A lager
(https://github.com/erlang-lager/lager) backend for Elixir's Logger
(https://hexdocs.pm/logger/Logger.html).
That is, it routes messages generated with Logger.<level>()
to lager
. This
is useful if you have a mixed Erlang/Elixir project and have decided to
standardize on lager
as a logging framework.
Known limitations:
- You're on your own to configure and start
lager
. - Only
lager
's default sink (:lager_event
) is used. - Performance is probably not ideal - all messages received are sent to
lager
regardless of the configured level andlager
's compile-time optimization does not happen. However,Logger
will still do its own optimization upstream of this backend. - Metadata is passed straight from
Logger
tolager
, hoping that the keys match. It seems to be the case for the basics (module
,function
...) but may need looking into.
Installation
Add logger_lager_backend
to your list of dependencies in mix.exs
:
def deps do
[{:logger_lager_backend, "~> 0.1.0"}]
end
Configuration
Instruct Logger
to use logger_lager_backend
:
config :logger,
backends: [LoggerLagerBackend],
handle_otp_reports: false,
level: :debug
This sends all messages of level debug
or higher to lager
. They will then
be subject to filtering and routing according to whichever lager
config you
have in place.
We also use handle_otp_reports: false
to avoid having messages from the
Erlang's built-in error_logger
module appear twice in the output.
Troubleshooting
FORMAT ERROR
s in log
If you get FORMAT ERROR
messages like this one:
FORMAT ERROR: "~s" [[<<"GenServer :redis_sub_0_8 terminating">>,<<"\n** (stop) ">>|<<":redis_down">>]
You're probably hitting erlang-lager/lager#326. Upgrade
lager
to 3.2.0
or more recent.
Elixir.Logger.Supervisor
error on startup
If you get the following message on startup:
[error] Supervisor 'Elixir.Logger.Supervisor' had child 'Elixir.Logger.ErrorHandler' started with
'Elixir.Logger.Watcher':watcher(error_logger, 'Elixir.Logger.ErrorHandler',
{true,false,500}, link) at <0.422.0> exit with reason normal in context child_terminated
Make sure the :lager
application is started before :logger
, by putting
:lager
first in your applications
list in mix.exs
:
def application do
[applications: [:lager, :logger, …],
mod: {MyApp, []}]
end
Related projects
- lager_logger does the
opposite of this backend: it sends
lager
messages toLogger
. - exlager offers an Elixir frontend to
lager
, which can be an alternative to this backend if you control all the code that does logging. But if you are using e.g.Ecto
, which writes toLogger
,exlager
will not help you.