Return-Path: Delivered-To: apmail-httpd-dev-archive@www.apache.org Received: (qmail 10860 invoked from network); 3 Feb 2010 08:22:51 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 3 Feb 2010 08:22:51 -0000 Received: (qmail 86722 invoked by uid 500); 3 Feb 2010 08:22:50 -0000 Delivered-To: apmail-httpd-dev-archive@httpd.apache.org Received: (qmail 86647 invoked by uid 500); 3 Feb 2010 08:22:49 -0000 Mailing-List: contact dev-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list dev@httpd.apache.org Received: (qmail 86638 invoked by uid 99); 3 Feb 2010 08:22:49 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Feb 2010 08:22:49 +0000 X-ASF-Spam-Status: No, hits=4.2 required=10.0 tests=FRT_LEVITRA,SPF_PASS,URIBL_BLACK X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [188.40.99.202] (HELO eru.sfritsch.de) (188.40.99.202) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Feb 2010 08:22:42 +0000 Received: from [10.1.1.6] (helo=k.localnet) by eru.sfritsch.de with esmtp (Exim 4.69) (envelope-from ) id 1NcaVA-00081d-IB for dev@httpd.apache.org; Wed, 03 Feb 2010 09:22:20 +0100 From: Stefan Fritsch To: dev@httpd.apache.org Subject: [PATCH] LogLevel refactoring part 1 Date: Wed, 3 Feb 2010 09:22:21 +0100 User-Agent: KMail/1.12.4 (Linux/2.6.32-trunk-amd64; KDE/4.3.4; x86_64; ; ) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_9ITaLjM+17QF291" Message-Id: <201002030922.21616.sf@sfritsch.de> --Boundary-00=_9ITaLjM+17QF291 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, I have factored two chunks out of the per-module LogLevel patch which make sense and could be commited to trunk even without the rest of the patch: ap_log_error_wrapper.diff: On C99 compilers, avoid argument setup and function call overhead if the log message will be discarded anyway. Also allow to disable higher loglevels at compile time by defining APLOG_MAX_LOGLEVEL. On pre-C99 compilers, it should just work like before. loglevel_trace.diff: Introduce additional log levels trace1 ... trace8 above the debug level. Comments? Cheers, Stefan --Boundary-00=_9ITaLjM+17QF291 Content-Type: text/x-patch; charset="ISO-8859-1"; name="ap_log_error_wrapper.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ap_log_error_wrapper.diff" diff --git a/configure.in b/configure.in index dc487c1..b6cb11c 100644 --- a/configure.in +++ b/configure.in @@ -170,6 +170,9 @@ dnl PCRE and for our config tests will be whatever PCRE determines. AC_PROG_CC AC_PROG_CPP +dnl Try to get c99 support for variadic macros +AC_PROG_CC_C99 + if test "x${cache_file}" = "x/dev/null"; then # Likewise, ensure that CC and CPP are passed through to the pcre # configure script iff caching is disabled (the autoconf 2.5x default). diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 3eb0aeb..beb3374 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -213,6 +213,9 @@ * 20091230.1 (2.3.5-dev) add util_ldap_state_t.opTimeout * 20091230.2 (2.3.5-dev) add ap_get_server_name_for_url() * 20091230.3 (2.3.6-dev) add ap_parse_log_level() + * 20100202.0 (2.3.6-dev) Make ap_log_*error macro wrappers around + * ap_log_*error_ to save argument preparation and + * function call overhead. * */ diff --git a/include/http_log.h b/include/http_log.h index d8d2b02..ef475a2 100644 --- a/include/http_log.h +++ b/include/http_log.h @@ -91,6 +91,28 @@ extern "C" { #define DEFAULT_LOGLEVEL APLOG_WARNING #endif +#ifndef APLOG_MAX_LOGLEVEL +#define APLOG_IS_LEVEL(s,level) \ + ((s == NULL) || \ + ((s)->loglevel >= ((level)& APLOG_LEVELMASK))) +#else +#define APLOG_IS_LEVEL(s,level) \ + (((level) <= APLOG_MAX_LOGLEVEL) && \ + ((s == NULL) || \ + ((s)->loglevel >= ((level) & APLOG_LEVELMASK)))) +#endif + +#define APLOGinfo(s) APLOG_IS_LEVEL(s,APLOG_INFO) +#define APLOGdebug(s) APLOG_IS_LEVEL(s,APLOG_DEBUG) + +#define APLOG_R_IS_LEVEL(r,level) APLOG_IS_LEVEL(r->server,level) +#define APLOGrinfo(r) APLOG_R_IS_LEVEL(r,APLOG_INFO) +#define APLOGrdebug(r) APLOG_R_IS_LEVEL(r,APLOG_DEBUG) + +#define APLOG_C_IS_LEVEL(c,level) APLOG_IS_LEVEL(c->base_server,level) +#define APLOGcinfo(c) APLOG_C_IS_LEVEL(c,APLOG_INFO) +#define APLOGcdebug(c) APLOG_C_IS_LEVEL(c,APLOG_DEBUG) + extern int AP_DECLARE_DATA ap_default_loglevel; #define APLOG_MARK __FILE__,__LINE__ @@ -164,10 +186,20 @@ void ap_logs_child_init(apr_pool_t *p, server_rec *s); * simple format string like "%s", followed by the string containing the * untrusted data. */ -AP_DECLARE(void) ap_log_error(const char *file, int line, int level, - apr_status_t status, const server_rec *s, - const char *fmt, ...) - __attribute__((format(printf,6,7))); +#if __STDC_VERSION__ >= 199901L +/* need additional step to expand APLOG_MARK first */ +#define ap_log_error(...) ap_log_error__(__VA_ARGS__) +#define ap_log_error__(file, line, level, status, s, ...) \ + do { server_rec *sr = s; if (APLOG_IS_LEVEL(sr, level)) \ + ap_log_error_(file, line, level, status, sr, __VA_ARGS__); \ + } while(0) +#else +#define ap_log_error ap_log_error_ +#endif +AP_DECLARE(void) ap_log_error_(const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const char *fmt, ...) + __attribute__((format(printf,6,7))); /** * ap_log_perror() - log messages which are not related to a particular @@ -212,9 +244,19 @@ AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, * simple format string like "%s", followed by the string containing the * untrusted data. */ -AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, - apr_status_t status, const request_rec *r, - const char *fmt, ...) +#if __STDC_VERSION__ >= 199901L +/* need additional step to expand APLOG_MARK first */ +#define ap_log_rerror(...) ap_log_rerror__(__VA_ARGS__) +#define ap_log_rerror__(file, line, level, status, r, ...) \ + do { if (APLOG_R_IS_LEVEL(r, level)) \ + ap_log_rerror_(file, line, level, status, r, __VA_ARGS__); \ + } while(0) +#else +#define ap_log_rerror ap_log_rerror_ +#endif +AP_DECLARE(void) ap_log_rerror_(const char *file, int line, int level, + apr_status_t status, const request_rec *r, + const char *fmt, ...) __attribute__((format(printf,6,7))); /** @@ -238,9 +280,19 @@ AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, * simple format string like "%s", followed by the string containing the * untrusted data. */ -AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level, - apr_status_t status, const conn_rec *c, - const char *fmt, ...) +#if __STDC_VERSION__ >= 199901L +/* need additional step to expand APLOG_MARK first */ +#define ap_log_cerror(...) ap_log_cerror__(__VA_ARGS__) +#define ap_log_cerror__(file, line, level, status, c, ...) \ + do { if (APLOG_C_IS_LEVEL(c, level)) \ + ap_log_cerror_(file, line, level, status, c, __VA_ARGS__); \ + } while(0) +#else +#define ap_log_cerror ap_log_cerror_ +#endif +AP_DECLARE(void) ap_log_cerror_(const char *file, int line, int level, + apr_status_t status, const conn_rec *c, + const char *fmt, ...) __attribute__((format(printf,6,7))); /** diff --git a/server/log.c b/server/log.c index c3abd5a..0f8e5d2 100644 --- a/server/log.c +++ b/server/log.c @@ -721,9 +721,9 @@ static void log_error_core(const char *file, int line, int level, ap_run_error_log(file, line, level, status, s, r, pool, errstr + errstrlen); } -AP_DECLARE(void) ap_log_error(const char *file, int line, int level, - apr_status_t status, const server_rec *s, - const char *fmt, ...) +AP_DECLARE(void) ap_log_error_(const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const char *fmt, ...) { va_list args; @@ -743,9 +743,9 @@ AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, va_end(args); } -AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, - apr_status_t status, const request_rec *r, - const char *fmt, ...) +AP_DECLARE(void) ap_log_rerror_(const char *file, int line, int level, + apr_status_t status, const request_rec *r, + const char *fmt, ...) { va_list args; @@ -772,9 +772,9 @@ AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, va_end(args); } -AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level, - apr_status_t status, const conn_rec *c, - const char *fmt, ...) +AP_DECLARE(void) ap_log_cerror_(const char *file, int line, int level, + apr_status_t status, const conn_rec *c, + const char *fmt, ...) { va_list args; --Boundary-00=_9ITaLjM+17QF291 Content-Type: text/x-patch; charset="ISO-8859-1"; name="loglevel_trace.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="loglevel_trace.diff" diff --git a/include/http_log.h b/include/http_log.h index ef475a2..e0e0d16 100644 --- a/include/http_log.h +++ b/include/http_log.h @@ -39,29 +39,45 @@ extern "C" { #define LOG_PRIMASK 7 #endif -#define APLOG_EMERG LOG_EMERG /* system is unusable */ -#define APLOG_ALERT LOG_ALERT /* action must be taken immediately */ -#define APLOG_CRIT LOG_CRIT /* critical conditions */ -#define APLOG_ERR LOG_ERR /* error conditions */ -#define APLOG_WARNING LOG_WARNING /* warning conditions */ -#define APLOG_NOTICE LOG_NOTICE /* normal but significant condition */ -#define APLOG_INFO LOG_INFO /* informational */ -#define APLOG_DEBUG LOG_DEBUG /* debug-level messages */ - -#define APLOG_LEVELMASK LOG_PRIMASK /* mask off the level value */ +#define APLOG_EMERG LOG_EMERG /* system is unusable */ +#define APLOG_ALERT LOG_ALERT /* action must be taken immediately */ +#define APLOG_CRIT LOG_CRIT /* critical conditions */ +#define APLOG_ERR LOG_ERR /* error conditions */ +#define APLOG_WARNING LOG_WARNING /* warning conditions */ +#define APLOG_NOTICE LOG_NOTICE /* normal but significant condition */ +#define APLOG_INFO LOG_INFO /* informational */ +#define APLOG_DEBUG LOG_DEBUG /* debug-level messages */ +#define APLOG_TRACE1 (LOG_DEBUG + 1) /* trace-level 1 messages */ +#define APLOG_TRACE2 (LOG_DEBUG + 2) /* trace-level 2 messages */ +#define APLOG_TRACE3 (LOG_DEBUG + 3) /* trace-level 3 messages */ +#define APLOG_TRACE4 (LOG_DEBUG + 4) /* trace-level 4 messages */ +#define APLOG_TRACE5 (LOG_DEBUG + 5) /* trace-level 5 messages */ +#define APLOG_TRACE6 (LOG_DEBUG + 6) /* trace-level 6 messages */ +#define APLOG_TRACE7 (LOG_DEBUG + 7) /* trace-level 7 messages */ +#define APLOG_TRACE8 (LOG_DEBUG + 8) /* trace-level 8 messages */ + +#define APLOG_LEVELMASK ((LOG_PRIMASK << 1) + 1) /* mask off the level value */ #else -#define APLOG_EMERG 0 /* system is unusable */ -#define APLOG_ALERT 1 /* action must be taken immediately */ -#define APLOG_CRIT 2 /* critical conditions */ -#define APLOG_ERR 3 /* error conditions */ -#define APLOG_WARNING 4 /* warning conditions */ -#define APLOG_NOTICE 5 /* normal but significant condition */ -#define APLOG_INFO 6 /* informational */ -#define APLOG_DEBUG 7 /* debug-level messages */ - -#define APLOG_LEVELMASK 7 /* mask off the level value */ +#define APLOG_EMERG 0 /* system is unusable */ +#define APLOG_ALERT 1 /* action must be taken immediately */ +#define APLOG_CRIT 2 /* critical conditions */ +#define APLOG_ERR 3 /* error conditions */ +#define APLOG_WARNING 4 /* warning conditions */ +#define APLOG_NOTICE 5 /* normal but significant condition */ +#define APLOG_INFO 6 /* informational */ +#define APLOG_DEBUG 7 /* debug-level messages */ +#define APLOG_TRACE1 8 /* trace-level 1 messages */ +#define APLOG_TRACE2 9 /* trace-level 2 messages */ +#define APLOG_TRACE3 10 /* trace-level 3 messages */ +#define APLOG_TRACE4 11 /* trace-level 4 messages */ +#define APLOG_TRACE5 12 /* trace-level 5 messages */ +#define APLOG_TRACE6 13 /* trace-level 6 messages */ +#define APLOG_TRACE7 14 /* trace-level 7 messages */ +#define APLOG_TRACE8 15 /* trace-level 8 messages */ + +#define APLOG_LEVELMASK 15 /* mask off the level value */ #endif @@ -104,14 +120,38 @@ extern "C" { #define APLOGinfo(s) APLOG_IS_LEVEL(s,APLOG_INFO) #define APLOGdebug(s) APLOG_IS_LEVEL(s,APLOG_DEBUG) +#define APLOGtrace1(s) APLOG_IS_LEVEL(s,APLOG_TRACE1) +#define APLOGtrace2(s) APLOG_IS_LEVEL(s,APLOG_TRACE2) +#define APLOGtrace3(s) APLOG_IS_LEVEL(s,APLOG_TRACE3) +#define APLOGtrace4(s) APLOG_IS_LEVEL(s,APLOG_TRACE4) +#define APLOGtrace5(s) APLOG_IS_LEVEL(s,APLOG_TRACE5) +#define APLOGtrace6(s) APLOG_IS_LEVEL(s,APLOG_TRACE6) +#define APLOGtrace7(s) APLOG_IS_LEVEL(s,APLOG_TRACE7) +#define APLOGtrace8(s) APLOG_IS_LEVEL(s,APLOG_TRACE8) #define APLOG_R_IS_LEVEL(r,level) APLOG_IS_LEVEL(r->server,level) #define APLOGrinfo(r) APLOG_R_IS_LEVEL(r,APLOG_INFO) #define APLOGrdebug(r) APLOG_R_IS_LEVEL(r,APLOG_DEBUG) +#define APLOGrtrace1(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE1) +#define APLOGrtrace2(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE2) +#define APLOGrtrace3(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE3) +#define APLOGrtrace4(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE4) +#define APLOGrtrace5(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE5) +#define APLOGrtrace6(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE6) +#define APLOGrtrace7(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE7) +#define APLOGrtrace8(r) APLOG_R_IS_LEVEL(r,APLOG_TRACE8) #define APLOG_C_IS_LEVEL(c,level) APLOG_IS_LEVEL(c->base_server,level) #define APLOGcinfo(c) APLOG_C_IS_LEVEL(c,APLOG_INFO) #define APLOGcdebug(c) APLOG_C_IS_LEVEL(c,APLOG_DEBUG) +#define APLOGctrace1(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE1) +#define APLOGctrace2(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE2) +#define APLOGctrace3(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE3) +#define APLOGctrace4(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE4) +#define APLOGctrace5(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE5) +#define APLOGctrace6(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE6) +#define APLOGctrace7(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE7) +#define APLOGctrace8(r) APLOG_C_IS_LEVEL(c,APLOG_TRACE8) extern int AP_DECLARE_DATA ap_default_loglevel; diff --git a/server/log.c b/server/log.c index 0f8e5d2..c822562 100644 --- a/server/log.c +++ b/server/log.c @@ -134,6 +134,14 @@ static const TRANS priorities[] = { {"notice", APLOG_NOTICE}, {"info", APLOG_INFO}, {"debug", APLOG_DEBUG}, + {"trace1", APLOG_TRACE1}, + {"trace2", APLOG_TRACE2}, + {"trace3", APLOG_TRACE3}, + {"trace4", APLOG_TRACE4}, + {"trace5", APLOG_TRACE5}, + {"trace6", APLOG_TRACE6}, + {"trace7", APLOG_TRACE7}, + {"trace8", APLOG_TRACE8}, {NULL, -1}, }; @@ -606,7 +614,7 @@ static void log_error_core(const char *file, int line, int level, "[%s] ", priorities[level_and_mask].t_name); } - if (file && level_and_mask == APLOG_DEBUG) { + if (file && level_and_mask >= APLOG_DEBUG) { #if defined(_OSD_POSIX) || defined(WIN32) || defined(__MVS__) char tmp[256]; char *e = strrchr(file, '/'); @@ -714,7 +722,8 @@ static void log_error_core(const char *file, int line, int level, } #ifdef HAVE_SYSLOG else { - syslog(level_and_mask, "%s", errstr); + syslog(level_and_mask < APLOG_DEBUG ? level_and_mask : APLOG_DEBUG, + "%s", errstr); } #endif @@ -1130,7 +1139,7 @@ AP_DECLARE(void) ap_close_piped_log(piped_log *pl) AP_DECLARE(const char *) ap_parse_log_level(const char *str, int *val) { char *err = "Loglevel keyword must be one of emerg/alert/crit/error/warn/" - "notice/info/debug"; + "notice/info/debug/trace1/.../trace8"; int i = 0; if (str == NULL) --Boundary-00=_9ITaLjM+17QF291--