summaryrefslogtreecommitdiff
path: root/src/ejabberd_logger.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_logger.erl')
-rw-r--r--src/ejabberd_logger.erl118
1 files changed, 53 insertions, 65 deletions
diff --git a/src/ejabberd_logger.erl b/src/ejabberd_logger.erl
index 243864c7..795d4f39 100644
--- a/src/ejabberd_logger.erl
+++ b/src/ejabberd_logger.erl
@@ -50,6 +50,7 @@
%% "ejabberd.log" in current directory.
%% Note: If the directory where to place the ejabberd log file to not exist,
%% it is not created and no log file will be generated.
+%% @spec () -> string()
get_log_path() ->
case ejabberd_config:env_binary_to_list(ejabberd, log_path) of
{ok, Path} ->
@@ -74,68 +75,6 @@ opt_type(log_rate_limit) ->
opt_type(_) ->
[log_rotate_date, log_rotate_size, log_rotate_count, log_rate_limit].
-%% Default logger module is LAGER, defined in else clause.
-%% TODO: Remove p1_logger usage and allow using Elixir logger if running in Elixir context.
--ifdef(P1LOGGER).
-
-start() ->
- set(4),
- LogPath = get_log_path(),
- error_logger:add_report_handler(p1_logger_h, LogPath),
- ok.
-
-reopen_log() ->
- %% TODO: Use the Reopen log API for logger_h ?
- p1_logger_h:reopen_log(),
- reopen_sasl_log().
-
-rotate_log() ->
- %% Not implemented.
- ok.
-
-get() ->
- p1_loglevel:get().
-
-set(LogLevel) when LogLevel >=0, LogLevel =< 5 ->
- p1_loglevel:set(LogLevel);
-set(LogLevel) ->
- throw({wrong_loglevel, LogLevel}).
-
-%%%===================================================================
-%%% Internal functions
-%%%===================================================================
-reopen_sasl_log() ->
- case application:get_env(sasl,sasl_error_logger) of
- {ok, {file, SASLfile}} ->
- error_logger:delete_report_handler(sasl_report_file_h),
- rotate_sasl_log(SASLfile),
- error_logger:add_report_handler(sasl_report_file_h,
- {SASLfile, get_sasl_error_logger_type()});
- _ -> false
- end,
- ok.
-
-rotate_sasl_log(Filename) ->
- case file:read_file_info(Filename) of
- {ok, _FileInfo} ->
- file:rename(Filename, [Filename, ".0"]),
- ok;
- {error, _Reason} ->
- ok
- end.
-
-%% Function copied from Erlang/OTP lib/sasl/src/sasl.erl which doesn't export it
-get_sasl_error_logger_type () ->
- case application:get_env (sasl, errlog_type) of
- {ok, error} -> error;
- {ok, progress} -> progress;
- {ok, all} -> all;
- {ok, Bad} -> exit ({bad_config, {sasl, {errlog_type, Bad}}});
- _ -> all
- end.
-
--else.
-
get_integer_env(Name, Default) ->
case application:get_env(ejabberd, Name) of
{ok, I} when is_integer(I), I>=0 ->
@@ -161,7 +100,33 @@ get_string_env(Name, Default) ->
Default
end.
+%% @spec () -> ok
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 ejabberd logger options, using Elixir Logger.", []),
+ %% Do not start lager, we rely on Elixir Logger
+ do_start_for_logger();
+ _ ->
+ do_start()
+ end.
+
+do_start_for_logger() ->
+ application:load(sasl),
+ application:set_env(sasl, sasl_error_logger, false),
+ application:load(lager),
+ 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, info}]}]),
+ ejabberd:start_app(lager),
+ ok.
+
+%% Start lager
+do_start() ->
application:load(sasl),
application:set_env(sasl, sasl_error_logger, false),
application:load(lager),
@@ -188,10 +153,12 @@ start() ->
ejabberd:start_app(lager),
ok.
+%% @spec () -> ok
reopen_log() ->
%% Lager detects external log rotation automatically.
ok.
+%% @spec () -> ok
rotate_log() ->
lager_crash_log ! rotate,
lists:foreach(
@@ -201,8 +168,9 @@ rotate_log() ->
ok
end, gen_event:which_handlers(lager_event)).
+%% @spec () -> {loglevel(), atom(), string()}
get() ->
- case lager:get_loglevel(lager_console_backend) of
+ case get_lager_loglevel() of
none -> {0, no_log, "No log"};
emergency -> {1, critical, "Critical"};
alert -> {1, critical, "Critical"};
@@ -214,6 +182,7 @@ get() ->
debug -> {5, debug, "Debug"}
end.
+%% @spec (loglevel() | {loglevel(), list()}) -> {module, module()}
set(LogLevel) when is_integer(LogLevel) ->
LagerLogLevel = case LogLevel of
0 -> none;
@@ -224,7 +193,7 @@ set(LogLevel) when is_integer(LogLevel) ->
5 -> debug;
E -> throw({wrong_loglevel, E})
end,
- case lager:get_loglevel(lager_console_backend) of
+ case get_lager_loglevel() of
LagerLogLevel ->
ok;
_ ->
@@ -234,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))
@@ -243,4 +214,21 @@ set({_LogLevel, _}) ->
error_logger:error_msg("custom loglevels are not supported for 'lager'"),
{module, lager}.
--endif.
+get_lager_loglevel() ->
+ 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
+ {'EXIT',noproc} ->
+ [];
+ Result ->
+ Result
+ end.