On Thu, 24 Dec 2009, Paul Querna wrote:
On Wed, Dec 23, 2009 at 4:14 AM, Stefan Fritsch <[email protected]> wrote:
An alternative implementation would be something along the lines of
how reconnoiter does logging:
<https://labs.omniti.com/trac/reconnoiter/browser/trunk/src/utils/noit_log.h>
This would definitely be a larger rewrite in general for logging, but
would be much more flexible in the long run, but I have grown fond of
how reconoiter's logging subsystem has worked.
Most modules would do this in their init function:
dlog = ap_log_stream_find("mod_foo/debug")
elog = ap_log_stream_find("mod_foo/error")
Where dlog/elog are static globals for that file. If the logging
system is disabled for that module, logging in the module is then done
like this:
apL(dlog, "foo is wrong: %d", bar);
I don't see how this would work well with per vhost log level
configuration. Any idea?
Also, I want something that can be implemented on 2.4 time scales and
won't delay the release of 2.4. Maybe we should leave a larger rewrite for
3.0?
Our current system only has emerg, alert, crit, error, warn, notice,
info, debug, but because they are not configurable per-module, they
are difficult to use effectively, I think in general if we had
per-module logging, we could easily get by with just critical, error,
info, and debug.
mod_ssl currently has three sublevels for log level debug, mod_rewrite has
six. Unless we keep the special directives like RewriteLogLevel, we need
more levels, not fewer. But if the consensus is that keeping
RewriteLogLevel is preferred, I am fine with that, too.
Some granularity below module level would be nice, too. For example:
ssl.reneg, ssl.require, ssl.session_cache, ...
But this is something that I would leave for 3.0, too.
For the implementation I thought of some loglevel vector similar to
the construct used by ap_get_module_config. There should then be a
ap_get_module_loglevel and the ap_log_*error functions would get the
module_index as additional parameter. To make things somewhat source
compatible, one could redefine APLOG_MARK to something like
__FILE__,__LINE__,GLOBAL, i.e. most modules could be compiled without
changes (but would then use the global log level). To add support to a
module, something like
#define APLOG_MARK_LDAP __FILE__,__LINE__,ldap_module->module_index
and a global search and replace would be enough for most modules (or
one could even redefine APLOG_MARK in the module source).
hmm, I'm not sure I really like having to redefine APLOG_MARK in every
file.. It would be nice if we could build the macro into the module
declaration perhaps?
Sure. Any idea how to do that in a non-ugly way?
Maybe in httpd.h:
#define AP_USE_MODULE_LOG(mod) \
static int *ap_log_module_index = &mod->module_index
#define AP_LOG_MARK __FILE__,__LINE__,*ap_log_module_index
and then in mod_xyz.c:
module AP_MODULE_DECLARE_DATA xyz_module;
#ifdef AP_USE_MODULE_LOG
AP_USE_MODULE_LOG(xyz_module);
#endif
...
ap_log_error(AP_LOG_MARK, ...
This would at least compile with 2.2.x, too.