diff options
author | iilyak <iilyak@users.noreply.github.com> | 2021-04-01 14:17:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-01 14:17:56 -0700 |
commit | 96b782baf9bfd8278b5bde9c3b4724227ae33e82 (patch) | |
tree | 9e004b9d65037d0cb4968a88f984dee853ecab5d | |
parent | 27bb2c209f4d776a7269b61d97437eaf81309adf (diff) | |
parent | 01448025e773d2911ee1020a3e132007d5acb662 (diff) | |
download | couchdb-96b782baf9bfd8278b5bde9c3b4724227ae33e82.tar.gz |
Merge pull request #3489 from cloudant/configurable_filter_fields
Configurable filter fields
-rw-r--r-- | rel/overlay/etc/default.ini | 5 | ||||
-rw-r--r-- | src/couch_log/src/couch_log_config.erl | 24 | ||||
-rw-r--r-- | src/couch_log/src/couch_log_config_dyn.erl | 3 | ||||
-rw-r--r-- | src/couch_log/src/couch_log_formatter.erl | 7 | ||||
-rw-r--r-- | src/couch_log/src/couch_log_sup.erl | 2 | ||||
-rw-r--r-- | src/couch_log/test/eunit/couch_log_config_test.erl | 48 |
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). |