From cefb6aaef59bb424534163837c2f62fa1d1d161d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Wed, 26 Jan 2022 16:02:04 +0100 Subject: [PATCH] cth_log_redirect_any_domains: common_test hook to handle domain-specific log messages common_test installs its own logger handler, which is great. Unfortunately, this logger handler drops all messages having a domain, except when the domain is among the domains used by Erlang itself. In RabbitMQ, we use logger domains to categorize messages. Therefore those messages are dropped by the common_test's logger handler. This commit introduces another logger handler which sits on top of the common_test one and makes sure messages with a domain are logged as well. --- .gitignore | 2 ++ .../src/cth_log_redirect_any_domains.erl | 23 ++++++++++++++ .../src/rabbit_ct_helpers.erl | 30 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 deps/rabbitmq_ct_helpers/src/cth_log_redirect_any_domains.erl diff --git a/.gitignore b/.gitignore index 20bffb3fa9..769653969d 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ !/deps/rabbitmq_cli/ !/deps/rabbitmq_codegen/ !/deps/rabbitmq_consistent_hash_exchange/ +!/deps/rabbitmq_ct_helpers/ +!/deps/rabbitmq_ct_client_helpers/ !/deps/rabbitmq_event_exchange/ !/deps/rabbitmq_federation/ !/deps/rabbitmq_federation_management/ diff --git a/deps/rabbitmq_ct_helpers/src/cth_log_redirect_any_domains.erl b/deps/rabbitmq_ct_helpers/src/cth_log_redirect_any_domains.erl new file mode 100644 index 0000000000..4caa1cf6fd --- /dev/null +++ b/deps/rabbitmq_ct_helpers/src/cth_log_redirect_any_domains.erl @@ -0,0 +1,23 @@ +-module(cth_log_redirect_any_domains). + +-export([log/2]). + +-define(BACKEND_MODULE, cth_log_redirect). + +%% Reversed behavior compared to `cth_log_redirect': log events with an +%% unknown domain are sent to the `cth_log_redirect' server, others are +%% dropped (as they are already handled by `cth_log_redirect'). +log(#{msg:={report,_Msg},meta:=#{domain:=[otp,sasl]}},_Config) -> + ok; +log(#{meta:=#{domain:=[otp]}},_Config) -> + ok; +log(#{meta:=#{domain:=_}}=Log,Config) -> + do_log(add_log_category(Log,error_logger),Config); +log(_Log,_Config) -> + ok. + +add_log_category(#{meta:=Meta}=Log,Category) -> + Log#{meta=>Meta#{?BACKEND_MODULE=>#{category=>Category}}}. + +do_log(Log,Config) -> + gen_server:call(?BACKEND_MODULE,{log,Log,Config}). diff --git a/deps/rabbitmq_ct_helpers/src/rabbit_ct_helpers.erl b/deps/rabbitmq_ct_helpers/src/rabbit_ct_helpers.erl index b72f4f244c..6b62f59b98 100644 --- a/deps/rabbitmq_ct_helpers/src/rabbit_ct_helpers.erl +++ b/deps/rabbitmq_ct_helpers/src/rabbit_ct_helpers.erl @@ -7,6 +7,7 @@ -module(rabbit_ct_helpers). +-include_lib("kernel/include/logger.hrl"). -include_lib("common_test/include/ct.hrl"). -deprecated({is_mixed_versions,1,"Use is_mixed_versions/0 instead"}). @@ -26,6 +27,7 @@ load_rabbitmqctl_app/1, ensure_rabbitmq_plugins_cmd/1, ensure_rabbitmq_queues_cmd/1, + redirect_logger_to_ct_logs/1, init_skip_as_error_flag/1, start_long_running_testsuite_monitor/1, stop_long_running_testsuite_monitor/1, @@ -155,6 +157,34 @@ run_steps(Config, [Step | Rest]) -> run_steps(Config, []) -> Config. +redirect_logger_to_ct_logs(Config) -> + ct:pal( + ?LOW_IMPORTANCE, + "Configuring logger to send logs to common_test logs"), + logger:set_handler_config(cth_log_redirect, level, debug), + + %% Let's use the same format as RabbitMQ itself. + logger:set_handler_config( + cth_log_redirect, formatter, + rabbit_prelaunch_early_logging:default_file_formatter(#{})), + + %% We use an addition logger handler for messages tagged with a non-OTP + %% domain because by default, `cth_log_redirect' drop them. + {ok, LogCfg0} = logger:get_handler_config(cth_log_redirect), + LogCfg = maps:remove(id, maps:remove(module, LogCfg0)), + ok = logger:add_handler( + cth_log_redirect_any_domains, cth_log_redirect_any_domains, + LogCfg), + + logger:remove_handler(default), + + ct:pal( + ?LOW_IMPORTANCE, + "Logger configured to send logs to common_test logs; you should see " + "a message below saying so"), + ?LOG_INFO("Logger message logged to common_test logs"), + Config. + init_skip_as_error_flag(Config) -> SkipAsError = case os:getenv("RABBITMQ_CT_SKIP_AS_ERROR") of false -> false;