From eae80e973c4272c1b2dcb4ddea9a1551edb26dea Mon Sep 17 00:00:00 2001 From: Eric Covener Date: Tue, 3 Jun 2014 13:17:58 +0000 Subject: [PATCH] add GlobalLog directive to allow a diagnostic log to be inherited by all virtual hosts, even if they define their own logs. Submitted By: Edward Lu Committed by: covener git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1599535 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 4 ++++ modules/loggers/mod_log_config.c | 37 ++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 2e04c4808c..ab3be90a9d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_log_config: Add GlobalLog to allow a globally defined log to + be inherited by virtual hosts that define a CustomLog. + [Edward Lu ] + *) MPMs: Support SO_REUSEPORT to create multiple duplicated listener records for scalability. [Yingqi Lu , Jeff Trawick, Jim Jagielski] diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index a34e4c4b44..8313af68a0 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -262,6 +262,7 @@ typedef struct { apr_array_header_t *format; void *log_writer; char *condition_var; + int inherit; ap_expr_info_t *condition_expr; /** place of definition or NULL if already checked */ const ap_directive_t *directive; @@ -1171,12 +1172,15 @@ static int multi_log_transaction(request_rec *r) config_log_transaction(r, cls, mls->default_format); } } - else if (mls->server_config_logs) { + + if (mls->server_config_logs) { clsarray = (config_log_state *) mls->server_config_logs->elts; for (i = 0; i < mls->server_config_logs->nelts; ++i) { config_log_state *cls = &clsarray[i]; - config_log_transaction(r, cls, mls->default_format); + if (cls->inherit || !mls->config_logs->nelts) { + config_log_transaction(r, cls, mls->default_format); + } } } @@ -1301,6 +1305,33 @@ static const char *add_custom_log(cmd_parms *cmd, void *dummy, const char *fn, return err_string; } +static const char *add_global_log(cmd_parms *cmd, void *dummy, const char *fn, + const char *fmt, const char *envclause) { + multi_log_state *mls = ap_get_module_config(cmd->server->module_config, + &log_config_module); + config_log_state *clsarray; + config_log_state *cls; + const char *ret; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err) { + return err; + } + + /* Add a custom log through the normal channel */ + ret = add_custom_log(cmd, dummy, fn, fmt, envclause); + + /* Set the inherit flag unless there was some error */ + if (ret == NULL) { + clsarray = (config_log_state*)mls->config_logs->elts; + cls = &clsarray[mls->config_logs->nelts-1]; + cls->inherit = 1; + } + + return ret; +} + static const char *set_transfer_log(cmd_parms *cmd, void *dummy, const char *fn) { @@ -1325,6 +1356,8 @@ static const command_rec config_log_cmds[] = AP_INIT_TAKE23("CustomLog", add_custom_log, NULL, RSRC_CONF, "a file name, a custom log format string or format name, " "and an optional \"env=\" or \"expr=\" clause (see docs)"), +AP_INIT_TAKE23("GlobalLog", add_global_log, NULL, RSRC_CONF, + "Same as CustomLog, but forces virtualhosts to inherit the log"), AP_INIT_TAKE1("TransferLog", set_transfer_log, NULL, RSRC_CONF, "the filename of the access log"), AP_INIT_TAKE12("LogFormat", log_format, NULL, RSRC_CONF, -- 2.40.0