Skip to content

Commit c7c7a75

Browse files
authored
feat: config which meta fields to include (#11)
1 parent ec86c02 commit c7c7a75

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ To print each json object to a new line, set `new_line` to `true`:
3939
#{formatter => {jsonformat, #{ new_line => true }}}
4040
```
4141

42+
To control what is being included in the log object from the metadata, there
43+
are two ways. One can opt-out from fields. Default opts out is `[report_cb]`.
44+
45+
#{ meta_without => [report_cb, gl, file, domain] }
46+
47+
Or for very detailed control there is instead opt-in.
48+
49+
#{ meta_with => [time, mfa, line, user_key, client_key] }
50+
4251
To rename keys in the resulting json object, provide a `key_mapping`. For
4352
example, to rename the `time` and `level` keys to `timestamp` and `lvl`
4453
respectively, use:

src/jsonformat.erl

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ format(#{msg:={report, #{format:=Format, args:=Args, label:={error_logger, _}}}}
4343
Report = #{text => io_lib:format(Format, Args)},
4444
format(Map#{msg := {report, Report}}, Config);
4545
format(#{level:=Level, msg:={report, Msg}, meta:=Meta}, Config) when is_map(Msg) ->
46-
Data0 = maps:merge(Msg, Meta#{level => Level}),
46+
Data0 = merge_meta(Msg, Meta#{level => Level}, Config),
4747
Data1 = apply_key_mapping(Data0, Config),
4848
Data2 = apply_format_funs(Data1, Config),
4949
encode(pre_encode(Data2, Config), Config);
@@ -75,6 +75,11 @@ pre_encode(Data, Config) ->
7575
maps:new(),
7676
Data).
7777

78+
merge_meta(Msg, Meta0, Config) ->
79+
Meta1 = meta_without(Meta0, Config),
80+
Meta2 = meta_with(Meta1, Config),
81+
maps:merge(Msg, Meta2).
82+
7883
encode(Data, Config) ->
7984
Json = jsx:encode(Data),
8085
case new_line(Config) of
@@ -121,6 +126,15 @@ apply_key_mapping(Data, _) ->
121126

122127
new_line(Config) -> maps:get(new_line, Config, ?NEW_LINE).
123128

129+
meta_without(Meta, Config) ->
130+
maps:without(maps:get(meta_without, Config, [report_cb]), Meta).
131+
132+
meta_with(Meta, #{ meta_with := Ks}) ->
133+
maps:with(Ks, Meta);
134+
meta_with(Meta, _ConfigNotPresent) ->
135+
Meta.
136+
137+
124138
%%%_* Tests ============================================================
125139
-ifdef(TEST).
126140
-include_lib("eunit/include/eunit.hrl").
@@ -171,6 +185,38 @@ list_format_test() ->
171185
?assertEqual( <<"{\"level\":\"error\",\"report\":\"[{hej,\\\"hopp\\\"}]\",\"time\":1}">>
172186
, format(ErrorReport, #{})).
173187

188+
meta_without_test() ->
189+
Error = #{ level => info
190+
, msg => {report, #{answer => 42}}
191+
, meta => #{secret => xyz}},
192+
?assertEqual([ {<<"answer">>, 42}
193+
, {<<"level">>, <<"info">>}
194+
, {<<"secret">>, <<"xyz">>}
195+
],
196+
jsx:decode(format(Error, #{}))),
197+
Config2 = #{ meta_without => [secret]},
198+
?assertEqual([ {<<"answer">>, 42}
199+
, {<<"level">>, <<"info">>}
200+
],
201+
jsx:decode(format(Error, Config2))),
202+
ok.
203+
204+
meta_with_test() ->
205+
Error = #{ level => info
206+
, msg => {report, #{answer => 42}}
207+
, meta => #{secret => xyz}},
208+
?assertEqual([ {<<"answer">>, 42}
209+
, {<<"level">>, <<"info">>}
210+
, {<<"secret">>, <<"xyz">>}
211+
],
212+
jsx:decode(format(Error, #{}))),
213+
Config2 = #{ meta_with => [level]},
214+
?assertEqual([ {<<"answer">>, 42}
215+
, {<<"level">>, <<"info">>}
216+
],
217+
jsx:decode(format(Error, Config2))),
218+
ok.
219+
174220
-endif.
175221

176222
%%%_* Emacs ============================================================

0 commit comments

Comments
 (0)