From 11ed58c24190a4bb98334c803984ac648dc0c139 Mon Sep 17 00:00:00 2001 From: Christian Sunesson Date: Tue, 5 Oct 2021 10:40:14 +0200 Subject: [PATCH 1/3] extract meta merge function --- src/jsonformat.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/jsonformat.erl b/src/jsonformat.erl index 8994544..472a5c7 100644 --- a/src/jsonformat.erl +++ b/src/jsonformat.erl @@ -43,7 +43,7 @@ format(#{msg:={report, #{format:=Format, args:=Args, label:={error_logger, _}}}} Report = #{text => io_lib:format(Format, Args)}, format(Map#{msg := {report, Report}}, Config); format(#{level:=Level, msg:={report, Msg}, meta:=Meta}, Config) when is_map(Msg) -> - Data0 = maps:merge(Msg, Meta#{level => Level}), + Data0 = merge_meta(Msg, Meta#{level => Level}, Config), Data1 = apply_key_mapping(Data0, Config), Data2 = apply_format_funs(Data1, Config), encode(pre_encode(Data2, Config), Config); @@ -75,6 +75,9 @@ pre_encode(Data, Config) -> maps:new(), Data). +merge_meta(Msg, Meta, _Config) -> + maps:merge(Msg, Meta). + encode(Data, Config) -> Json = jsx:encode(Data), case new_line(Config) of From 356476a149fcac8fe867c8010684a5947d12f498 Mon Sep 17 00:00:00 2001 From: Christian Sunesson Date: Tue, 5 Oct 2021 11:29:56 +0200 Subject: [PATCH 2/3] feat: config to opt in/out from meta fields --- src/jsonformat.erl | 47 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/jsonformat.erl b/src/jsonformat.erl index 472a5c7..a444206 100644 --- a/src/jsonformat.erl +++ b/src/jsonformat.erl @@ -75,8 +75,10 @@ pre_encode(Data, Config) -> maps:new(), Data). -merge_meta(Msg, Meta, _Config) -> - maps:merge(Msg, Meta). +merge_meta(Msg, Meta0, Config) -> + Meta1 = meta_without(Meta0, Config), + Meta2 = meta_with(Meta1, Config), + maps:merge(Msg, Meta2). encode(Data, Config) -> Json = jsx:encode(Data), @@ -124,6 +126,15 @@ apply_key_mapping(Data, _) -> new_line(Config) -> maps:get(new_line, Config, ?NEW_LINE). +meta_without(Meta, Config) -> + maps:without(maps:get(meta_without, Config, [report_cb]), Meta). + +meta_with(Meta, #{ meta_with := Ks}) -> + maps:with(Ks, Meta); +meta_with(Meta, _ConfigNotPresent) -> + Meta. + + %%%_* Tests ============================================================ -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). @@ -174,6 +185,38 @@ list_format_test() -> ?assertEqual( <<"{\"level\":\"error\",\"report\":\"[{hej,\\\"hopp\\\"}]\",\"time\":1}">> , format(ErrorReport, #{})). +meta_without_test() -> + Error = #{ level => info + , msg => {report, #{answer => 42}} + , meta => #{secret => xyz}}, + ?assertEqual([ {<<"answer">>, 42} + , {<<"level">>, <<"info">>} + , {<<"secret">>, <<"xyz">>} + ], + jsx:decode(format(Error, #{}))), + Config2 = #{ meta_without => [secret]}, + ?assertEqual([ {<<"answer">>, 42} + , {<<"level">>, <<"info">>} + ], + jsx:decode(format(Error, Config2))), + ok. + +meta_with_test() -> + Error = #{ level => info + , msg => {report, #{answer => 42}} + , meta => #{secret => xyz}}, + ?assertEqual([ {<<"answer">>, 42} + , {<<"level">>, <<"info">>} + , {<<"secret">>, <<"xyz">>} + ], + jsx:decode(format(Error, #{}))), + Config2 = #{ meta_with => [level]}, + ?assertEqual([ {<<"answer">>, 42} + , {<<"level">>, <<"info">>} + ], + jsx:decode(format(Error, Config2))), + ok. + -endif. %%%_* Emacs ============================================================ From 4b230c42737d5af83a61f5b6290bd06cbe775c05 Mon Sep 17 00:00:00 2001 From: Christian Sunesson Date: Wed, 6 Oct 2021 10:14:20 +0200 Subject: [PATCH 3/3] add README doc --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 48e0c70..8eaec57 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,15 @@ To print each json object to a new line, set `new_line` to `true`: #{formatter => {jsonformat, #{ new_line => true }}} ``` +To control what is being included in the log object from the metadata, there +are two ways. One can opt-out from fields. Default opts out is `[report_cb]`. + + #{ meta_without => [report_cb, gl, file, domain] } + +Or for very detailed control there is instead opt-in. + + #{ meta_with => [time, mfa, line, user_key, client_key] } + To rename keys in the resulting json object, provide a `key_mapping`. For example, to rename the `time` and `level` keys to `timestamp` and `lvl` respectively, use: