aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_loglevel.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_loglevel.erl')
-rw-r--r--src/ejabberd_loglevel.erl61
1 files changed, 20 insertions, 41 deletions
diff --git a/src/ejabberd_loglevel.erl b/src/ejabberd_loglevel.erl
index 3134d4d03..2a340606b 100644
--- a/src/ejabberd_loglevel.erl
+++ b/src/ejabberd_loglevel.erl
@@ -38,51 +38,30 @@
-define(LOGMODULE, "error_logger").
%% Error levels:
-%% 0 -> No log
-%% 1 -> Critical
-%% 2 -> Error
-%% 3 -> Warning
-%% 4 -> Info
-%% 5 -> Debug
+-define(LOG_LEVELS,[ {0, no_log, "No log"}
+ ,{1, critical, "Critical"}
+ ,{2, error, "Error"}
+ ,{3, warning, "Warning"}
+ ,{4, info, "Info"}
+ ,{5, debug, "Debug"}
+ ]).
+
+set(LogLevel) when is_atom(LogLevel) ->
+ set(level_to_integer(LogLevel));
set(Loglevel) when is_integer(Loglevel) ->
- Forms = compile_string(?LOGMODULE, ejabberd_logger_src(Loglevel)),
- load_logger(Forms, ?LOGMODULE, Loglevel);
+ try
+ {Mod,Code} = dynamic_compile:from_string(ejabberd_logger_src(Loglevel)),
+ code:load_binary(Mod, ?LOGMODULE ++ ".erl", Code)
+ catch
+ Type:Error -> ?CRITICAL_MSG("Error compiling logger (~p): ~p~n", [Type, Error])
+ end;
set(_) ->
exit("Loglevel must be an integer").
-
-%% --------------------------------------------------------------
-%% Compile a string into a module and returns the binary
-compile_string(Mod, Str) ->
- Fname = Mod ++ ".erl",
- {ok, Fd} = open_ram_file(Fname),
- file:write(Fd, Str),
- file:position(Fd, 0),
- case epp_dodger:parse(Fd) of
- {ok, Tree} ->
- Forms = revert_tree(Tree),
- close_ram_file(Fd),
- Forms;
- Error ->
- close_ram_file(Fd),
- Error
- end.
-
-open_ram_file(Fname) ->
- ram_file_io_server:start(self(), Fname, [read,write]).
-
-close_ram_file(Fd) ->
- file:close(Fd).
-
-revert_tree(Tree) ->
- [erl_syntax:revert(T) || T <- Tree].
-load_logger(Forms, Mod, Loglevel) ->
- Fname = Mod ++ ".erl",
- case compile:forms(Forms, [binary, {d,'LOGLEVEL',Loglevel}]) of
- {ok, M, Bin} ->
- code:load_binary(M, Fname, Bin);
- Error ->
- ?CRITICAL_MSG("Error ~p~n", [Error])
+level_to_integer(Level) ->
+ case lists:keyfind(Level, 2, ?LOG_LEVELS) of
+ {Int, Level, _Desc} -> Int;
+ _ -> erlang:error({no_such_loglevel, Level})
end.
%% --------------------------------------------------------------