summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriilyak <iilyak@users.noreply.github.com>2021-04-01 14:17:56 -0700
committerGitHub <noreply@github.com>2021-04-01 14:17:56 -0700
commit96b782baf9bfd8278b5bde9c3b4724227ae33e82 (patch)
tree9e004b9d65037d0cb4968a88f984dee853ecab5d
parent27bb2c209f4d776a7269b61d97437eaf81309adf (diff)
parent01448025e773d2911ee1020a3e132007d5acb662 (diff)
downloadcouchdb-96b782baf9bfd8278b5bde9c3b4724227ae33e82.tar.gz
Merge pull request #3489 from cloudant/configurable_filter_fields
Configurable filter fields
-rw-r--r--rel/overlay/etc/default.ini5
-rw-r--r--src/couch_log/src/couch_log_config.erl24
-rw-r--r--src/couch_log/src/couch_log_config_dyn.erl3
-rw-r--r--src/couch_log/src/couch_log_formatter.erl7
-rw-r--r--src/couch_log/src/couch_log_sup.erl2
-rw-r--r--src/couch_log/test/eunit/couch_log_config_test.erl48
6 files changed, 79 insertions, 10 deletions
diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini
index 6c992d7bd..9dafabaad 100644
--- a/rel/overlay/etc/default.ini
+++ b/rel/overlay/etc/default.ini
@@ -527,6 +527,11 @@ level = info
;
; max_message_size = 16000
;
+; Do not log last message received by terminated process
+; strip_last_msg = true
+;
+; List of fields to remove before logging the crash report
+; filter_fields = [pid, registered_name, error_info, messages]
;
; There are four different log writers that can be configured
; to write log messages. The default writes to stderr of the
diff --git a/src/couch_log/src/couch_log_config.erl b/src/couch_log/src/couch_log_config.erl
index ab076cc69..55925c39f 100644
--- a/src/couch_log/src/couch_log_config.erl
+++ b/src/couch_log/src/couch_log_config.erl
@@ -50,7 +50,8 @@ entries() ->
{level, "level", "info"},
{level_int, "level", "info"},
{max_message_size, "max_message_size", "16000"},
- {strip_last_msg, "strip_last_msg", "true"}
+ {strip_last_msg, "strip_last_msg", "true"},
+ {filter_fields, "filter_fields", "[pid, registered_name, error_info, messages]"}
].
@@ -104,4 +105,23 @@ transform(strip_last_msg, "false") ->
false;
transform(strip_last_msg, _) ->
- true.
+ true;
+
+transform(filter_fields, FieldsStr) ->
+ Default = [pid, registered_name, error_info, messages],
+ case parse_term(FieldsStr) of
+ {ok, List} when is_list(List) ->
+ case lists:all(fun erlang:is_atom/1, List) of
+ true ->
+ List;
+ false ->
+ Default
+ end;
+ _ ->
+ Default
+ end.
+
+
+parse_term(List) ->
+ {ok, Tokens, _} = erl_scan:string(List ++ "."),
+ erl_parse:parse_term(Tokens).
diff --git a/src/couch_log/src/couch_log_config_dyn.erl b/src/couch_log/src/couch_log_config_dyn.erl
index b39dcf2f5..1e1c927ae 100644
--- a/src/couch_log/src/couch_log_config_dyn.erl
+++ b/src/couch_log/src/couch_log_config_dyn.erl
@@ -26,4 +26,5 @@
get(level) -> info;
get(level_int) -> 2;
get(max_message_size) -> 16000;
-get(strip_last_msg) -> true.
+get(strip_last_msg) -> true;
+get(filter_fields) -> [pid, registered_name, error_info, messages].
diff --git a/src/couch_log/src/couch_log_formatter.erl b/src/couch_log/src/couch_log_formatter.erl
index 26997a8a6..3553666f6 100644
--- a/src/couch_log/src/couch_log_formatter.erl
+++ b/src/couch_log/src/couch_log_formatter.erl
@@ -199,7 +199,7 @@ format_crash_report(Report, Neighbours) ->
MsgFmt = "Process ~s with ~w neighbors ~s with reason: ~s",
Args = [Name, length(Neighbours), Type, ReasonStr],
Msg = io_lib:format(MsgFmt, Args),
- case filter_silly_list(Report, [pid, registered_name, error_info]) of
+ case filter_silly_list(Report) of
[] ->
Msg;
Rest ->
@@ -431,6 +431,11 @@ print_val(Val) ->
{Str, _} = couch_log_trunc_io:print(Val, 500),
Str.
+filter_silly_list(KV) ->
+ %% The complete list of fields is from here
+ %% https://github.com/erlang/otp/blob/7ca7a6c59543db8a6d26b95ae434e61a044b0800/lib/stdlib/src/proc_lib.erl#L539:L553
+ FilterFields = couch_log_config:get(filter_fields),
+ filter_silly_list(KV, FilterFields).
filter_silly_list([], _) ->
[];
diff --git a/src/couch_log/src/couch_log_sup.erl b/src/couch_log/src/couch_log_sup.erl
index fc1ac7812..6cb8d7395 100644
--- a/src/couch_log/src/couch_log_sup.erl
+++ b/src/couch_log/src/couch_log_sup.erl
@@ -65,6 +65,8 @@ handle_config_change("log", Key, _, _, S) ->
couch_log_config:reconfigure();
"strip_last_msg" ->
couch_log_config:reconfigure();
+ "filter_fields" ->
+ couch_log_config:reconfigure();
_ ->
% Someone may have changed the config for
% the writer so we need to re-initialize.
diff --git a/src/couch_log/test/eunit/couch_log_config_test.erl b/src/couch_log/test/eunit/couch_log_config_test.erl
index a4c4bcff2..e47a52bc2 100644
--- a/src/couch_log/test/eunit/couch_log_config_test.erl
+++ b/src/couch_log/test/eunit/couch_log_config_test.erl
@@ -16,18 +16,21 @@
-include_lib("couch_log/include/couch_log.hrl").
-include_lib("eunit/include/eunit.hrl").
+-define(T(Name), {atom_to_list(Name), fun Name/0}).
couch_log_config_test_() ->
{setup,
fun couch_log_test_util:start/0,
fun couch_log_test_util:stop/1,
[
- fun check_level/0,
- fun check_max_message_size/0,
- fun check_bad_level/0,
- fun check_bad_max_message_size/0,
- fun check_strip_last_msg/0,
- fun check_bad_strip_last_msg/0
+ ?T(check_level),
+ ?T(check_max_message_size),
+ ?T(check_bad_level),
+ ?T(check_bad_max_message_size),
+ ?T(check_strip_last_msg),
+ ?T(check_bad_strip_last_msg),
+ ?T(check_filter_fields),
+ ?T(check_bad_filter_fields)
]
}.
@@ -143,3 +146,36 @@ check_bad_strip_last_msg() ->
couch_log_test_util:wait_for_config(),
?assertEqual(true, couch_log_config:get(strip_last_msg))
end).
+
+
+check_filter_fields() ->
+ Default = [pid, registered_name, error_info, messages],
+ ?assertEqual(Default, couch_log_config:get(filter_fields)),
+
+ couch_log_test_util:with_config_listener(fun() ->
+ config:set("log", "filter_fields", "[foo, bar, baz]"),
+ couch_log_test_util:wait_for_config(),
+ ?assertEqual([foo, bar, baz], couch_log_config:get(filter_fields)),
+
+ config:delete("log", "filter_fields"),
+ couch_log_test_util:wait_for_config(),
+ ?assertEqual(Default, couch_log_config:get(filter_fields))
+ end).
+
+check_bad_filter_fields() ->
+ Default = [pid, registered_name, error_info, messages],
+ ?assertEqual(Default, couch_log_config:get(filter_fields)),
+
+ couch_log_test_util:with_config_listener(fun() ->
+ config:set("log", "filter_fields", "[foo, bar, baz]"),
+ couch_log_test_util:wait_for_config(),
+ ?assertEqual([foo, bar, baz], couch_log_config:get(filter_fields)),
+
+ config:set("log", "filter_fields", "not a list of atoms"),
+ couch_log_test_util:wait_for_config(),
+ ?assertEqual(Default, couch_log_config:get(filter_fields)),
+
+ config:delete("log", "filter_fields"),
+ couch_log_test_util:wait_for_config(),
+ ?assertEqual(Default, couch_log_config:get(filter_fields))
+ end).