]> granicus.if.org Git - ejabberd/commitdiff
Lager to Elixir Logger bridge is now compliant with ejabberd loglevel set / get
authorMickael Remond <mremond@process-one.net>
Wed, 9 Mar 2016 21:30:46 +0000 (22:30 +0100)
committerMickael Remond <mremond@process-one.net>
Wed, 9 Mar 2016 21:30:46 +0000 (22:30 +0100)
This should fix #966

src/ejabberd_logger.erl
src/elixir_logger_backend.erl

index a13ac814a732bf68d55fc25ac0785bf6ceb15b25..795d4f390e42a3d4201ac1435b3992c9c650855f 100644 (file)
@@ -104,8 +104,10 @@ get_string_env(Name, Default) ->
 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();
         _ ->
@@ -119,7 +121,7 @@ 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.
 
@@ -201,6 +203,8 @@ set(LogLevel) when is_integer(LogLevel) ->
                       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))
@@ -211,13 +215,15 @@ set({_LogLevel, _}) ->
     {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
index 583d46a5cce1aef89b944b2dcfdbe0e0aa8fc0a2..c055853f798a6c5be20c21738dd50665c4e646c6 100644 (file)
 -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, _} ->
@@ -55,13 +59,15 @@ handle_event({log, LagerMsg}, State) ->
         _ ->
             {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) ->
@@ -77,7 +83,8 @@ code_change(_OldVsn, State, _Extra) ->
 
 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