Browse Source

Rework logger configuration and add logger config generator

adt/lager_use_logger-option
Andrew Thompson 5 years ago
parent
commit
67466436aa
3 changed files with 54 additions and 36 deletions
  1. +6
    -2
      README.md
  2. +42
    -34
      src/lager.erl
  3. +6
    -0
      src/lager_app.erl

+ 6
- 2
README.md View File

@ -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 dependencies in any of your application's dependencies and thus ensure the parse
transform is the right version. transform is the right version.
XXX the following is not yet implemented:
To generate a logger configuration from your lager configuration you can do: 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.x Changelog
------------- -------------
3.6.8 - 21 December 2018 3.6.8 - 21 December 2018

+ 42
- 34
src/lager.erl View File

@ -37,7 +37,7 @@
update_loglevel_config/1, posix_error/1, set_loghwm/2, set_loghwm/3, set_loghwm/4, 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, 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]).
generate_logger_config/0, configure_logger/0]).
-type log_level() :: none | debug | info | notice | warning | error | critical | alert | emergency. -type log_level() :: none | debug | info | notice | warning | error | critical | alert | emergency.
-type log_level_number() :: 0..7. -type log_level_number() :: 0..7.
@ -690,54 +690,62 @@ rotate_handler(Handler) ->
rotate_handler(Handler, Sink) -> rotate_handler(Handler, Sink) ->
gen_event:call(Sink, Handler, rotate, ?ROTATE_TIMEOUT). 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() -> configure_logger() ->
Handlers = application:get_env(lager, handlers, lager_app:default_handlers()), Handlers = application:get_env(lager, handlers, lager_app:default_handlers()),
WhitelistedLoggerHandlers = application:get_env(lager, whitelisted_logger_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) ], [ 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), Level = proplists:get_value(level, Config, info),
Formatter = proplists:get_value(formatter, Config, lager_default_formatter), Formatter = proplists:get_value(formatter, Config, lager_default_formatter),
FormatterConfig = proplists:get_value(formatter_config, Config, []), 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), Level = proplists:get_value(level, Config, info),
File = proplists:get_value(file, Config), File = proplists:get_value(file, Config),
LogRoot = application:get_env(lager, log_root, ""),
Size = proplists:get_value(size, Config), Size = proplists:get_value(size, Config),
Count = proplists:get_value(count, Config), Count = proplists:get_value(count, Config),
Formatter = proplists:get_value(formatter, Config, lager_default_formatter), Formatter = proplists:get_value(formatter, Config, lager_default_formatter),
FormatterConfig = proplists:get_value(formatter_config, Config, []), 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 %% @private

+ 6
- 0
src/lager_app.erl View File

@ -235,6 +235,12 @@ start(_StartType, _StartArgs) ->
clean_up_config_checks(), clean_up_config_checks(),
{ok, Pid, SavedHandlers}; {ok, Pid, SavedHandlers};
true -> true ->
case application:get_env(lager, configure_logger, false) of
true ->
ok = lager:configure_logger();
false ->
ok
end,
{ok, Pid} {ok, Pid}
end. end.

Loading…
Cancel
Save