austinsmorris
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.
Thanks@
Most Liked
hauleth
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.
EDIT:
I will try to provide an example later.
fuelen
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)
:ok
iex(6)> require Logger
Logger
iex(7)> Logger.info("test", %{current_user_id: "qweqe"})
{"current_user_id":"qweqe","domain":["elixir"],"erlang_pid":"#PID<0.24423.0>","file":"iex","gl":"#PID<0.65.0>","level":"info","message":"test","time":1580851293206227,"timestamp":"2020-02-04T23:21:33.206Z"}
:ok
josevalim
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.
chulkilee
I checked the failed CI job from test elixir 1.10 by austinsmorris · Pull Request #30 · Nebo15/logger_json · GitHub
(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 - Handle metadata by chulkilee · Pull Request #12 · elixir-metadata-logger/metadata_logger · GitHub
Basically, Jason does not transform pid value - and the new erlang logger integration introduces new default metadata gl which is pid.
See Erlang -- logger for the list of metadata set by erlang
chulkilee
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…







