Recently I’ve been struggling to configure the logger in Elixir 1.15.x.
I created my logger handler
defmodule Foo.LoggerHandler do
@behaviour :gen_event
@impl true
def init(args) do
IO.inspect(args, label: "ARGS IN HANDLER INIT")
{:ok, {:this_is_the_state, args}}
end
@impl true
def handle_call(request, state) do
IO.inspect(request, label: "REQUEST IN HANDLER HANDLE CALL")
IO.inspect(state, label: "STATE IN HANDLER HANDLE CALL")
{:ok, "blah blah", state}
end
@impl true
def handle_event(event, state) do
IO.inspect(event, label: "EVENT IN HANDLER HANDLE EVENT")
IO.inspect(state, label: "STATE IN HANDLER HANDLE EVENT")
{:ok, state}
end
end
and a formatter module (I don’t know if this is the correct way):
defmodule Foo.LoggerFormatter do
def format(event, config) do
IO.inspect(event, label: "EVENT IN FORMATTER")
IO.inspect(config, label: "CONFIG IN FORMATTER")
"This is the result of the formatter"
end
end
The config.exs is pretty simple:
import Config
config :logger, :default_handler, false
config :foo, :logger, [
{
:handler,
:my_handler,
Foo.LoggerHandler,
%{
config: %{
xxx: 123,
yyy: 456
},
formatter: Foo.LoggerFormatter
}
}
]
And I added this line to my application.ex:
defmodule Foo.Application do
use Application
@impl true
def start(_type, _args) do
LoggerBackends.add(Foo.LoggerHandler) # <----- Just this line
children = []
opts = [strategy: :one_for_one, name: Foo.Supervisor]
Supervisor.start_link(children, opts)
end
end
When I ran iex -S mix
, I saw the following messages printed to the terminal:
ARGS IN HANDLER INIT: Foo.LoggerHandler
It seems that my logger handler does not get the configuration.
When I ran Logger.info aaa: 111, bbb: 222
in iex, I saw
EVENT IN HANDLER HANDLE EVENT: {:info, #PID<0.183.0>,
{Logger, "[aaa: 111, bbb: 222]", {{2023, 11, 22}, {16, 19, 54, 873}},
[
erl_level: :info,
pid: #PID<0.192.0>,
time: 1700641194873059,
gl: #PID<0.183.0>,
domain: [:elixir]
]}}
STATE IN HANDLER HANDLE EVENT: {:this_is_the_state, Foo.LoggerHandler}
The formatter is definitely not called at all.
Where did I do wrong? Thanks in advance.