diff --git a/src/lager.erl b/src/lager.erl index c8ffb0e..025f768 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -36,7 +36,8 @@ get_loglevel/1, get_loglevel/2, set_loglevel/2, set_loglevel/3, set_loglevel/4, get_loglevels/1, 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]). + do_log/9, do_log/10, do_log_unsafe/10, pr/2, pr/3, pr_stacktrace/1, pr_stacktrace/2, + configure_logger/0]). -type log_level() :: none | debug | info | notice | warning | error | critical | alert | emergency. -type log_level_number() :: 0..7. @@ -689,6 +690,56 @@ rotate_handler(Handler) -> rotate_handler(Handler, Sink) -> gen_event:call(Sink, Handler, rotate, ?ROTATE_TIMEOUT). + +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). + +add_logger_handlers([]) -> + ok; +add_logger_handlers([{lager_console_backend, Config}|Tail]) -> + 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]) -> + Level = proplists:get_value(level, Config, info), + File = proplists:get_value(file, Config), + 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). + + %% @private trace_func(#trace_func_state_v1{pid=Pid, level=Level, format_string=Fmt}=FuncState, Event, ProcState) -> lager:log(Level, Pid, Fmt, [Event, ProcState]), diff --git a/src/lager_app.erl b/src/lager_app.erl index 53f880d..7815005 100644 --- a/src/lager_app.erl +++ b/src/lager_app.erl @@ -31,7 +31,8 @@ start_handler/3, configure_sink/2, stop/1, - boot/1]). + boot/1, + default_handlers/0]). %% The `application:get_env/3` compatibility wrapper was useful %% for other modules in r15 and before @@ -281,6 +282,9 @@ stop(Handlers) -> error_logger:add_report_handler(Handler) end, Handlers). +default_handlers() -> + ?DEFAULT_HANDLER_CONF. + expand_handlers([]) -> []; expand_handlers([{lager_file_backend, [{Key, _Value}|_]=Config}|T]) when is_atom(Key) ->