ejabberd_loglevel:set/1 now understands more input formats:
set(Param) -> {module, ejabberd_logger}
Param = Level | {Level, CustomLevels}
CustomLevels = [CustomLevel]
CustomLevel = {Module, Level}
Module = atom()
Level = integer() | atom()
set(Level) is equivalent to set({Level, []}), so it clears all module
level customizations. log_src/2 adds additional function heads for those
_msg function and module combinations that need non-default behavior,
i.e. add or filter logging.
ejabberd_loglevel:get/0 only returns the default log level. To retrieve
the complete setting use ejabberd_logger:get/0 instead.
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.
Iterating through the list of possible parent domains of a given domain
and comparing with the list of hosts or routes is almost always faster
than doing it the other way around. It naturally returns the shortest or
longest parent domain satisfying a predicate, whereas the possibly long
list compared with would need to be sorted by length first.
Previous definition do not work with gen_storage.
gen_storage creates the table when they don't exists, but if
they exists it simple uses that definition.
Note that the column values also had changed in gen_storage,
so instead of "B" for a bidirectional subscription, it must be
"both". Keep this in mind when loading data into the DB