Hi, While adding some debug log statements to a module I'm working on, I ran into the problem that ap_log_error (in apache 2.2) does not support %zd or %zu conversion for type_t arguments. This was problematic to make the code compile on both 32 and 64 bit platforms. So I made a small wrapper (see below) to workaround the problem. I suggest to build support for %zd and %zu conversion into the unified logger.
/** * ap_log_error does not support %zd or %zu conversion for type_t arguments * So with ap_log_error one would have to specify either %d or %ld, depending on the * platform (32-bit or 64-bit). This violates the whole purpose of type_t, which * was introduced in C exactly to provide cross-platform compatibility... * This wrapper function supports %zd and %zu conversion parameters. * Note that it truncates the logged message to 1000 bytes, so don't use it to log messages that might * be longer */ void ap_log_error_wrapper(const char *file, int line, int level, apr_status_t status, const server_rec *s, const char *fmt, ...) { char msg[1000]; va_list ap; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); ap_log_error(file, line, level, status, s, "%s", msg); } Cheers, Alex Op 27-07-10 23:11, Stefan Fritsch schreef: > On Wednesday 21 July 2010, William A. Rowe Jr. wrote: > >> On 7/21/2010 4:35 PM, Stefan Fritsch wrote: >> >>> And I agree that a unified logging formatter would be nice, but >>> this is not something that will be done before 2.3.7 and it >>> would likely mean an incompatible API change for modules >>> providing handlers for mod_log_config. IMHO, this can wait until >>> 3.0. >>> >> IMHO, it must not. The simple reason is that the more code >> duplication we introduce, the more opportunity for flaws and >> maintenance headaches during the 2.4 lifecycle. I'd accept >> waiting for this entire custom error log feature for 3.0, but >> really would rather introduce it sooner and not later. >> > I fear a unified logging formatter may either delay 2.4 or not make it > into 2.4. In 2.4, we really need some way to omit some of the fields > we currently have in the error log prefix (> 100 chars of prefix is > insane). But as I had less time in the last few days than I hoped, it > does not look like my (non-unified) errorlog formatter would be ready > for 2.3.7 in any case. So we will have time until 2.3.8 to decide what > to do. > > >> If there is a resulting API change, I think everyone is willing to >> accept this during the 2.3-alpha/beta cycle. 2.4.0 is our >> 'lockdown'. >> >> I'm willing to help with this code, although I'm just starting to >> dig out of the hole from my two recent hand surgeries. 6-finger >> typing isn't all that efficient :) >> > I think there are more important things that could use your and my > attention than avoiding this bit of code duplication. > > > Buf if you want to start a bit of technical discussion: The main > technical difference between error and access log is that for the > access log, everything is allocated from the request pool and then > written to the log file (i.e. there is no length limit). For the error > log, there is a fixed 8K buffer (allocated on the stack). For the > error log, it is not possible to use any of the existing pools to > avoid unbounded memory usage. The unified log formatter would either > have to use a pre-allocated buffer or a temp pool. > > For my work on the error log formatter, I have stayed with the pre- > allocated buffer. Would this be a reasonable solution for the unified > logger? It would mean a fixed limit for the access logs lines (though > the access log could use a larger buffer than the error log, I guess > 16 or 32K would be enough even for the access log). The pool approach > would require a per-thread temp logging pool (using > apr_threadkey_private_create or the like) or creating and destroying a > sub-pool for every log line. > > Which solution looks better to you? > > > Cheers, > Stefan > >