summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorILYA Khlopotov <iilyak@apache.org>2021-02-22 04:46:43 -0800
committerILYA Khlopotov <iilyak@apache.org>2021-03-31 02:49:05 -0700
commit96bdc211b34a28d02bf0a4d35858a0aa7434de9c (patch)
tree7475c461193f03b89829ce1efa3f9deaba51005b
parent5cac2c54d0d2277e7edab7f2f88787209b4ad5b1 (diff)
downloadcouchdb-96bdc211b34a28d02bf0a4d35858a0aa7434de9c.tar.gz
Make silly list configurable
-rw-r--r--rel/overlay/etc/default.ini3
-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.erl37
6 files changed, 71 insertions, 5 deletions
diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini
index 8ee51ffa9..25f3cca37 100644
--- a/rel/overlay/etc/default.ini
+++ b/rel/overlay/etc/default.ini
@@ -644,6 +644,9 @@ level = info
; 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
; Erlang VM which is useful for debugging/development as well
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 b8ee2dab5..e47a52bc2 100644
--- a/src/couch_log/test/eunit/couch_log_config_test.erl
+++ b/src/couch_log/test/eunit/couch_log_config_test.erl
@@ -28,7 +28,9 @@ couch_log_config_test_() ->
?T(check_bad_level),
?T(check_bad_max_message_size),
?T(check_strip_last_msg),
- ?T(check_bad_strip_last_msg)
+ ?T(check_bad_strip_last_msg),
+ ?T(check_filter_fields),
+ ?T(check_bad_filter_fields)
]
}.
@@ -144,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).