From 67466436aa40a968a104c5babb0c6f4bfae23fec Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Sun, 1 Mar 2020 19:56:49 -0800 Subject: [PATCH] Rework logger configuration and add logger config generator --- README.md | 8 +++-- src/lager.erl | 76 ++++++++++++++++++++++++++--------------------- src/lager_app.erl | 6 ++++ 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 9f70145..e5585d2 100644 --- a/README.md +++ b/README.md @@ -1179,8 +1179,6 @@ support these options. A toplevel dependency will override any lager dependencies in any of your application's dependencies and thus ensure the parse transform is the right version. -XXX the following is not yet implemented: - To generate a logger configuration from your lager configuration you can do: ``` @@ -1197,6 +1195,12 @@ lager configure logger you can, in your sys.config in the lager stanza: ]} ``` +Alternatively you can use: + +``` +lager:configure_logger() +``` + 3.x Changelog ------------- 3.6.8 - 21 December 2018 diff --git a/src/lager.erl b/src/lager.erl index 025f768..a905904 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -37,7 +37,7 @@ update_loglevel_config/1, posix_error/1, set_loghwm/2, set_loghwm/3, set_loghwm/4, safe_format/3, safe_format_chop/3, unsafe_format/2, dispatch_log/5, dispatch_log/7, dispatch_log/9, do_log/9, do_log/10, do_log_unsafe/10, pr/2, pr/3, pr_stacktrace/1, pr_stacktrace/2, - configure_logger/0]). + generate_logger_config/0, configure_logger/0]). -type log_level() :: none | debug | info | notice | warning | error | critical | alert | emergency. -type log_level_number() :: 0..7. @@ -690,54 +690,62 @@ rotate_handler(Handler) -> rotate_handler(Handler, Sink) -> gen_event:call(Sink, Handler, rotate, ?ROTATE_TIMEOUT). +generate_logger_config() -> + Handlers = application:get_env(lager, handlers, lager_app:default_handlers()), + {Level, NewHandlers} = generate_logger_handlers(Handlers, {notice, []}), + {kernel, [{logger_level, Level}, {logger, NewHandlers}]}. configure_logger() -> Handlers = application:get_env(lager, handlers, lager_app:default_handlers()), WhitelistedLoggerHandlers = application:get_env(lager, whitelisted_logger_handlers, []), [ ok = logger:remove_handler(Id) || #{id := Id} <- logger:get_handler_config(), not lists:member(Id, WhitelistedLoggerHandlers) ], - add_logger_handlers(Handlers). + {Level, NewHandlers} = generate_logger_handlers(Handlers, {notice, []}), + logger:set_primary_config(maps:merge(logger:get_primary_config(), #{level => Level})), + [ ok = logger:add_handler(HandlerId, HandlerModule, HandlerConfig) || {handler, HandlerId, HandlerModule, HandlerConfig} <- NewHandlers ], + ok. -add_logger_handlers([]) -> - ok; -add_logger_handlers([{lager_console_backend, Config}|Tail]) -> +generate_logger_handlers([], Acc) -> + Acc; +generate_logger_handlers([{lager_console_backend, Config}|Tail], {CurrentLevel, Acc}) -> Level = proplists:get_value(level, Config, info), Formatter = proplists:get_value(formatter, Config, lager_default_formatter), FormatterConfig = proplists:get_value(formatter_config, Config, []), - logger:add_handler(console, logger_std_h, #{level => Level, formatter => - {lager_logger_formatter, #{report_cb => fun lager_logger_formatter:report_cb/1, - formatter => Formatter, - formatter_config => FormatterConfig}}}), - PriConfig = #{level := CurrentLevel} = logger:get_primary_config(), - case lager_util:level_to_num(Level) > lager_util:level_to_num(CurrentLevel) of - true -> - logger:set_primary_config(maps:merge(PriConfig, #{level => Level})); - false -> - ok - end, - add_logger_handlers(Tail); -add_logger_handlers([{lager_file_backend, Config}|Tail]) -> + Handler = {handler, console, logger_std_h, #{level => Level, formatter => + {lager_logger_formatter, #{report_cb => fun lager_logger_formatter:report_cb/1, + formatter => Formatter, + formatter_config => FormatterConfig}}}}, + NewLevel = case lager_util:level_to_num(Level) > lager_util:level_to_num(CurrentLevel) of + true -> + Level; + false -> + CurrentLevel + end, + generate_logger_handlers(Tail, {NewLevel, [Handler|Acc]}); +generate_logger_handlers([{lager_file_backend, Config}|Tail], {CurrentLevel, Acc}) -> Level = proplists:get_value(level, Config, info), File = proplists:get_value(file, Config), + LogRoot = application:get_env(lager, log_root, ""), Size = proplists:get_value(size, Config), Count = proplists:get_value(count, Config), Formatter = proplists:get_value(formatter, Config, lager_default_formatter), FormatterConfig = proplists:get_value(formatter_config, Config, []), - logger:add_handler(list_to_atom(File), logger_disk_log_h, #{level => Level, - file => File, - max_no_files => Count, - max_no_bytes => Size, - formatter => - {lager_logger_formatter, #{report_cb => fun lager_logger_formatter:report_cb/1, - formatter => Formatter, - formatter_config => FormatterConfig}}}), - PriConfig = #{level := CurrentLevel} = logger:get_primary_config(), - case lager_util:level_to_num(Level) > lager_util:level_to_num(CurrentLevel) of - true -> - logger:set_primary_config(maps:merge(PriConfig, #{level => Level})); - false -> - ok - end, - add_logger_handlers(Tail). + %% XXX I don't think disk_log is suitable as it is, we should provide a logger compatible version of + %% lager's file_backend and try to patch disk_log upstream + Handler = {handler, list_to_atom(File), logger_disk_log_h, #{level => Level, + file => filename:join(LogRoot, File), + max_no_files => Count, + max_no_bytes => Size, + formatter => + {lager_logger_formatter, #{report_cb => fun lager_logger_formatter:report_cb/1, + formatter => Formatter, + formatter_config => FormatterConfig}}}}, + NewLevel = case lager_util:level_to_num(Level) > lager_util:level_to_num(CurrentLevel) of + true -> + Level; + false -> + CurrentLevel + end, + generate_logger_handlers(Tail, {NewLevel, [Handler|Acc]}). %% @private diff --git a/src/lager_app.erl b/src/lager_app.erl index 7815005..e0d5094 100644 --- a/src/lager_app.erl +++ b/src/lager_app.erl @@ -235,6 +235,12 @@ start(_StartType, _StartArgs) -> clean_up_config_checks(), {ok, Pid, SavedHandlers}; true -> + case application:get_env(lager, configure_logger, false) of + true -> + ok = lager:configure_logger(); + false -> + ok + end, {ok, Pid} end.