diff options
Diffstat (limited to 'src/ejabberd_loglevel.erl')
-rw-r--r-- | src/ejabberd_loglevel.erl | 61 |
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. %% -------------------------------------------------------------- |