diff options
author | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-01-13 18:43:32 +0100 |
---|---|---|
committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-01-13 18:48:20 +0100 |
commit | decd38634bc993ee5325ec4d9683c01c7e114f82 (patch) | |
tree | 1fb203a69cafe855cfd5e1e7c4f61378a29fc90a | |
parent | 672ce60348b6d766a8f071f5573a3385bc7dfa61 (diff) | |
download | rabbitmq-server-git-decd38634bc993ee5325ec4d9683c01c7e114f82.tar.gz |
rabbit_prelaunch_early_logging: Setup all categories early
... instead of `prelaunch` category only. This allows to see the
messages logged to the new `feature_flags` category as they are logged
before the final configuration of logging (because logging requires
configuration which requires feature flags).
-rw-r--r-- | apps/rabbitmq_prelaunch/src/rabbit_prelaunch_early_logging.erl | 75 | ||||
-rw-r--r-- | src/rabbit_lager.erl | 22 |
2 files changed, 61 insertions, 36 deletions
diff --git a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_early_logging.erl b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_early_logging.erl index 66883e501b..d5a5486f10 100644 --- a/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_early_logging.erl +++ b/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_early_logging.erl @@ -1,18 +1,22 @@ -module(rabbit_prelaunch_early_logging). +-include_lib("rabbit_common/include/rabbit_log.hrl"). + -export([setup_early_logging/2, enable_quick_dbg/1, use_colored_logging/0, - use_colored_logging/1]). - --define(SINK, rabbit_log_prelaunch_lager_event). + use_colored_logging/1, + list_expected_sinks/0]). setup_early_logging(#{log_levels := undefined} = Context, LagerEventToStdout) -> setup_early_logging(Context#{log_levels => get_default_log_level()}, LagerEventToStdout); setup_early_logging(Context, LagerEventToStdout) -> - case lists:member(?SINK, lager:list_all_sinks()) of + Configured = lists:member( + lager_util:make_internal_sink_name(rabbit_log_prelaunch), + lager:list_all_sinks()), + case Configured of true -> ok; false -> do_setup_early_logging(Context, LagerEventToStdout) end. @@ -22,25 +26,27 @@ get_default_log_level() -> do_setup_early_logging(#{log_levels := LogLevels} = Context, LagerEventToStdout) -> - LogLevel = case LogLevels of - #{"prelaunch" := Level} -> Level; - #{global := Level} -> Level; - _ -> warning - end, Colored = use_colored_logging(Context), - ConsoleBackend = lager_console_backend, - ConsoleOptions = [{level, LogLevel}], application:set_env(lager, colored, Colored), + ConsoleBackend = lager_console_backend, case LagerEventToStdout of true -> + GLogLevel = case LogLevels of + #{global := Level} -> Level; + _ -> warning + end, lager_app:start_handler( - lager_event, ConsoleBackend, ConsoleOptions); + lager_event, ConsoleBackend, [{level, GLogLevel}]); false -> ok end, - lager_app:configure_sink( - ?SINK, - [{handlers, [{ConsoleBackend, ConsoleOptions}]}]), + lists:foreach( + fun(Sink) -> + CLogLevel = get_log_level(LogLevels, Sink), + lager_app:configure_sink( + Sink, + [{handlers, [{ConsoleBackend, [{level, CLogLevel}]}]}]) + end, list_expected_sinks()), ok. use_colored_logging() -> @@ -52,6 +58,45 @@ use_colored_logging(#{log_levels := #{color := true}, use_colored_logging(_) -> false. +list_expected_sinks() -> + Key = {?MODULE, lager_extra_sinks}, + case persistent_term:get(Key, undefined) of + undefined -> + CompileOptions = proplists:get_value(options, + module_info(compile), + []), + AutoList = [lager_util:make_internal_sink_name(M) + || M <- proplists:get_value(lager_extra_sinks, + CompileOptions, [])], + List = case lists:member(?LAGER_SINK, AutoList) of + true -> AutoList; + false -> [?LAGER_SINK | AutoList] + end, + %% Store the list in the application environment. If this + %% module is later cover-compiled, the compile option will + %% be lost, so we will be able to retrieve the list from the + %% application environment. + persistent_term:put(Key, List), + List; + List -> + List + end. + +sink_to_category(Sink) when is_atom(Sink) -> + re:replace( + atom_to_list(Sink), + "^rabbit_log_(.+)_lager_event$", + "\\1", + [{return, list}]). + +get_log_level(LogLevels, Sink) -> + Category = sink_to_category(Sink), + case LogLevels of + #{Category := Level} -> Level; + #{global := Level} -> Level; + _ -> warning + end. + enable_quick_dbg(#{dbg_output := Output, dbg_mods := Mods}) -> case Output of stdout -> {ok, _} = dbg:tracer(); diff --git a/src/rabbit_lager.erl b/src/rabbit_lager.erl index 0af348d162..e9dce91909 100644 --- a/src/rabbit_lager.erl +++ b/src/rabbit_lager.erl @@ -664,27 +664,7 @@ maybe_configure_handler_backends([{Backend, _}|Backends]) -> maybe_configure_handler_backends(Backends). list_expected_sinks() -> - case application:get_env(rabbit, lager_extra_sinks) of - {ok, List} -> - List; - undefined -> - CompileOptions = proplists:get_value(options, - ?MODULE:module_info(compile), - []), - AutoList = [lager_util:make_internal_sink_name(M) - || M <- proplists:get_value(lager_extra_sinks, - CompileOptions, [])], - List = case lists:member(?LAGER_SINK, AutoList) of - true -> AutoList; - false -> [?LAGER_SINK | AutoList] - end, - %% Store the list in the application environment. If this - %% module is later cover-compiled, the compile option will - %% be lost, so we will be able to retrieve the list from the - %% application environment. - ok = application:set_env(rabbit, lager_extra_sinks, List), - List - end. + rabbit_prelaunch_early_logging:list_expected_sinks(). maybe_remove_logger_handler() -> M = logger, |