Both code comments and assertions are unfortunately not very popular. A quite efficient way to still get some documentation about the code are logging statements. In Elektra they are currently inconsistent and unusable. Thus there is an urge for this decision.
- this decision is irrelevant for plugins and bindings that are not written in C/C++. In any case, however, logging must be disabled by default.
- should completely compile away with ENABLE_LOGGER=OFF
- should support minimalistic, compile-time filtering (per modules and verbosity level?) and some sinks (stderr, syslog or files)
- run-time problems are checked via assertions, not logged
- opinions about if logging should be to stderr or files differ
- filtering with grep is not enough
- per default there should be no output
- with ENABLE_LOGGER=ON only warnings and errors should be shown on stderr
- other sinks like syslog and file may log more (they are not immediately visible and distracting)
- performance is not so important (because logging is usually turned off anyway)
- log similar to the warnings/error system work, discarded because of the run-time overhead and no use case why end users should see log statements.
- C++ logging library (boost, apache,..), discarded because C++ should not be in core
- libraries needed static initializing: problematic, logging should just work, even if application does not initialize anything
- using syslog: no info from which source file the logging statement comes from
- using journald: adds deps problematic for non-linux
- zlog: incompatible licence (LGPL)
Provide a Macro
ELEKTRA_LOG (int module, const char *msg, ...);
that calls
elektraLog ([as above], const char * function, const char * file,
const int line, ...);
and adds current function, file and line to elektraLog
's arguments.
elektraLog
is implemented in a separate log.c
file. If someone
needs filtering, logging to different sources or similar, he/she
simply modifies log.c
.
The severity passed to ELEKTRA_LOG_
should be as in syslog's priority,
except the error conditions which are not needed (asserts should be used
in these situations).
So we would have:
ELEKTRA_LOG_WARNING
: warning conditionsELEKTRA_LOG_NOTICE
: normal, but significant, conditionELEKTRA_LOG_INFO
: informational messageELEKTRA_LOG_DEBUG
: debug-level message
To add a new module, one simply adds his/her module to elektramodules.h
via
#define
:
#define ELEKTRA_MODULE_<NAME> <SEQNUMBER>
The module name <NAME>
shall be consistent with module names used in
module:
of src/error/specification
.
A more complex system seems to be overkill. Thus libraries should not have any effects other than what is described by their API, logging should nearly always be disabled.
A more "hackable" logger seems to be more suitable for individual needs.
Having a separate log.c
means that the logger can be changed without the
need to recompile anything but a single file. It also removes the dependency
of stdio.h
from every individual file to a single place.
Thus logging is very easy to use (only include elektralog.h
and use
ELEKTRA_LOG
) and still very flexible (with modules, severity, file, line
and function information nearly everything someone wants from a logging
system can be achieved in log.c
.
The current VERBOSE would be turned off forever and the code within VERBOSE
needs to be migrated to ELEKTRA_LOG
.
- assertions