aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Köhler <andreas.koehler@1und1.de>2010-10-12 15:30:18 +0200
committerBadlop <badlop@process-one.net>2010-10-15 13:15:44 +0200
commit0c2677bc50c81168a3447de7c8e9ca6a2425a54a (patch)
tree87ce7eb79e58995eccf574c84b73a118e3bf3466
parentUse records for encoding static loglevel information. (diff)
Improve ejabberd_logger code generation
Split the monolithic function ejabberd_loglevel:ejabberd_logger_src/1 into separate functions returning deep lists. log_src/2 now returns the code for any of *_msg/4. Its parameters are the current loglevel (integer()) and a loglevel specification (#loglevel{}), with added information in #loglevel: - function: The api function enabled by this level, may be no_log - event_type: The type of the event sent to the error_logger - msg_prefix: One character used in the message (one of "DIWEC") If the current loglevel is too low for logging, the api function is optimized at compile time.
-rw-r--r--src/ejabberd_loglevel.erl81
1 files changed, 40 insertions, 41 deletions
diff --git a/src/ejabberd_loglevel.erl b/src/ejabberd_loglevel.erl
index 4e98a5644..570a7640b 100644
--- a/src/ejabberd_loglevel.erl
+++ b/src/ejabberd_loglevel.erl
@@ -40,15 +40,23 @@
%% Error levels:
-record(loglevel, {ordinal,
name,
- description}).
+ description,
+ function = no_log,
+ event_type = no_log,
+ msg_prefix = no_log}).
-define(LOG_LEVELS,
[#loglevel{ordinal = 0, name = no_log, description = "No log"},
- #loglevel{ordinal = 1, name = critical, description = "Critical"},
- #loglevel{ordinal = 2, name = error, description = "Error"},
- #loglevel{ordinal = 3, name = warning, description = "Warning"},
- #loglevel{ordinal = 4, name = info, description = "Info"},
- #loglevel{ordinal = 5, name = debug, description = "Debug"}]).
+ #loglevel{ordinal = 1, name = critical, description = "Critical",
+ function = critical_msg, event_type = error, msg_prefix = "C"},
+ #loglevel{ordinal = 2, name = error, description = "Error",
+ function = error_msg, event_type = error, msg_prefix = "E"},
+ #loglevel{ordinal = 3, name = warning, description = "Warning",
+ function = warning_msg, event_type = error, msg_prefix = "W"},
+ #loglevel{ordinal = 4, name = info, description = "Info",
+ function = info_msg, event_type = info_msg, msg_prefix = "I"},
+ #loglevel{ordinal = 5, name = debug, description = "Debug",
+ function = debug_msg, event_type = info_msg, msg_prefix = "D"}]).
get() ->
Level = ejabberd_logger:get(),
@@ -83,7 +91,12 @@ level_to_integer(Level) ->
%% This allows to dynamically change log level while keeping a
%% very efficient code.
ejabberd_logger_src(Loglevel) ->
- L = integer_to_list(Loglevel),
+ lists:flatten([header_src(),
+ get_src(Loglevel),
+ [log_src(Loglevel, LevelSpec) || LevelSpec <- ?LOG_LEVELS],
+ notify_src()]).
+
+header_src() ->
"-module(ejabberd_logger).
-author('mickael.remond@process-one.net').
@@ -93,42 +106,28 @@ ejabberd_logger_src(Loglevel) ->
error_msg/4,
critical_msg/4,
get/0]).
+ ".
- get() -> "++ L ++".
-
- %% Helper functions
- debug_msg(Module, Line, Format, Args) when " ++ L ++ " >= 5 ->
- notify(info_msg,
- \"D(~p:~p:~p) : \"++Format++\"~n\",
- [self(), Module, Line]++Args);
- debug_msg(_,_,_,_) -> ok.
-
- info_msg(Module, Line, Format, Args) when " ++ L ++ " >= 4 ->
- notify(info_msg,
- \"I(~p:~p:~p) : \"++Format++\"~n\",
- [self(), Module, Line]++Args);
- info_msg(_,_,_,_) -> ok.
-
- warning_msg(Module, Line, Format, Args) when " ++ L ++ " >= 3 ->
- notify(error,
- \"W(~p:~p:~p) : \"++Format++\"~n\",
- [self(), Module, Line]++Args);
- warning_msg(_,_,_,_) -> ok.
-
- error_msg(Module, Line, Format, Args) when " ++ L ++ " >= 2 ->
- notify(error,
- \"E(~p:~p:~p) : \"++Format++\"~n\",
- [self(), Module, Line]++Args);
- error_msg(_,_,_,_) -> ok.
-
- critical_msg(Module, Line, Format, Args) when " ++ L ++ " >= 1 ->
- notify(error,
- \"C(~p:~p:~p) : \"++Format++\"~n\",
- [self(), Module, Line]++Args);
- critical_msg(_,_,_,_) -> ok.
-
+get_src(Loglevel) ->
+ ["get() -> ", integer_to_list(Loglevel), ".
+ "].
+
+log_src(_Loglevel, #loglevel{function = no_log}) ->
+ [];
+log_src(Loglevel, Spec = #loglevel{ordinal = MinLevel})
+ when Loglevel < MinLevel ->
+ [atom_to_list(Spec#loglevel.function), "(_, _, _, _) -> ok.
+ "];
+log_src(_Loglevel, Spec = #loglevel{}) ->
+ [atom_to_list(Spec#loglevel.function), "(Module, Line, Format, Args) ->
+ notify(", atom_to_list(Spec#loglevel.event_type), ",
+ \"", Spec#loglevel.msg_prefix, "(~p:~p:~p) : \"++Format++\"~n\",
+ [self(), Module, Line | Args]).
+ "].
+
+notify_src() ->
%% Distribute the message to the Erlang error logger
- notify(Type, Format, Args) ->
+ "notify(Type, Format, Args) ->
LoggerMsg = {Type, group_leader(), {self(), Format, Args}},
gen_event:notify(error_logger, LoggerMsg).
".