JSON Logger backend for elixir 1.10

Does anybody know of a JSON backend for Logger that works with the updates in elixir 1.10? I had been using logger_json but that broke pretty bad with the erlang/otp logger integration introduced in elixir 1.10.0.


1 Like

I wrote a formatter (not logger backend) - metadata_logger
. it’s very conservative (e.g. it avoids own transformation - e.g. passing pid would lead to error message)

For Elixir 1.10 and OTP 22 - they introduced new metadata and I fixed the library at https://github.com/elixir-metadata-logger/metadata_logger/pull/12

we use ink at work.
Test with Elixir 1.10:

ex(4)> Logger.add_backend(Ink)     
{:ok, #PID<0.24432.0>}
iex(5)> Logger.remove_backend(:console)
iex(6)> require Logger
iex(7)> Logger.info("test", %{current_user_id: "qweqe"})
1 Like

How did it break? Do you have link? Maybe I will be able to help.

In general the plan is to shift away from Elixir’s Logger formatters and backends and instead make use of Erlang’s logger.

So the “simplest” way for “modern” handling would be to (unfortunately) write custom formatter (that implements one function format/2) and then use it together with whatever backend you like.

I will try to provide an example later.


I checked the failed CI job from https://github.com/Nebo15/logger_json/pull/30

(Protocol.UndefinedError) protocol Jason.Encoder not implemented for #PID<0.63.0> of type PID, Jason.Encoder protocol must always be explicitly implemented.

It seems like the same problem I had with - https://github.com/elixir-metadata-logger/metadata_logger/pull/12

Basically, Jason does not transform pid value - and the new erlang logger integration introduces new default metadata gl which is pid.

See https://erlang.org/doc/man/logger.html#type-metadata for the list of metadata set by erlang

1 Like

Luckily the fix should be easy: just remove the fields with process information from the metadata. It probably already keeps a list of fields to remove, we just need to update it.


As erlang and elixir logger sees the same logger message… new metadata field may be added by either erlang or elixir. I believe previously Elixir.Logger would transform or fill metadata… but now I guess it does not (or will not) transform metadata, as a log message can be from erlang.

Anyway, metadata_loggerI converts metadata to map (dropping duplicated metadata!) and convert “known” values (e.g. gl).

Instead of doing converting “known” values - I may make it iterate all metadata (recursively or not) and transform values not implementing Jason protocol… but I want to avoid for performance reason. Or I may just implement Jason protocol to pid… but should I? I don’t want to “pollute” module not defined by my library…

1 Like