start() ->
StartedApps = application:which_applications(5000),
case lists:keyfind(logger, 1, StartedApps) of
+ %% Elixir logger is started. We assume everything is in place
+ %% to use lager to Elixir logger bridge.
{logger, _, _} ->
- error_logger:info_msg("Ignoring logger options, using Elixir Logger.", []),
+ error_logger:info_msg("Ignoring ejabberd logger options, using Elixir Logger.", []),
%% Do not start lager, we rely on Elixir Logger
do_start_for_logger();
_ ->
application:set_env(lager, error_logger_redirect, false),
application:set_env(lager, error_logger_whitelist, ['Elixir.Logger.ErrorHandler']),
application:set_env(lager, crash_log, false),
- application:set_env(lager, handlers, [{elixir_logger_backend, [{level, debug}]}]),
+ application:set_env(lager, handlers, [{elixir_logger_backend, [{level, info}]}]),
ejabberd:start_app(lager),
ok.
lager:set_loglevel(H, LagerLogLevel);
(lager_console_backend = H) ->
lager:set_loglevel(H, LagerLogLevel);
+ (elixir_logger_backend = H) ->
+ lager:set_loglevel(H, LagerLogLevel);
(_) ->
ok
end, gen_event:which_handlers(lager_event))
{module, lager}.
get_lager_loglevel() ->
- R = case get_lager_handlers() of
- [] -> none;
- [elixir_logger_backend] -> debug;
- [FirstHandler|_] ->
- lager:get_loglevel(FirstHandler)
- end,
- R.
+ Handlers = get_lager_handlers(),
+ lists:foldl(fun(lager_console_backend, _Acc) ->
+ lager:get_loglevel(lager_console_backend);
+ (elixir_logger_backend, _Acc) ->
+ lager:get_loglevel(elixir_logger_backend);
+ (_, Acc) ->
+ Acc
+ end,
+ none, Handlers).
get_lager_handlers() ->
case catch gen_event:which_handlers(lager_event) of
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2,
code_change/3]).
-init(_Opts) ->
- State = [],
+-record(state, {level = debug}).
+
+init(Opts) ->
+ Level = proplists:get_value(level, Opts, debug),
+ State = #state{level = Level},
{ok, State}.
%% @private
handle_event({log, LagerMsg}, State) ->
#{mode := Mode, truncate := Truncate, level := MinLevel, utc_log := UTCLog} = 'Elixir.Logger.Config':'__data__'(),
MsgLevel = severity_to_level(lager_msg:severity(LagerMsg)),
- case {lager_util:is_loggable(LagerMsg, lager_util:level_to_num(debug), ?MODULE), 'Elixir.Logger':compare_levels(MsgLevel, MinLevel)} of
+ case {lager_util:is_loggable(LagerMsg, lager_util:level_to_num(State#state.level), ?MODULE),
+ 'Elixir.Logger':compare_levels(MsgLevel, MinLevel)} of
{_, lt}->
{ok, State};
{true, _} ->
_ ->
{ok, State}
end;
-handle_event(_, State) ->
+handle_event(_Msg, State) ->
{ok, State}.
%% @private
%% TODO Handle loglevels
-handle_call(_Msg, State) ->
- {ok, ok, State}.
+handle_call(get_loglevel, State) ->
+ {ok, lager_util:config_to_mask(State#state.level), State};
+handle_call({set_loglevel, Config}, State) ->
+ {ok, ok, State#state{level = Config}}.
%% @private
handle_info(_Msg, State) ->
notify(sync, Msg) ->
gen_event:sync_notify('Elixir.Logger', Msg);
-notify(async, Msg) -> gen_event:notify('Elixir.Logger', Msg).
+notify(async, Msg) ->
+ gen_event:notify('Elixir.Logger', Msg).
normalize_pid(Metadata) ->
case proplists:get_value(pid, Metadata) of