From: Jim Jagielski Date: Wed, 30 Dec 2015 14:48:41 +0000 (+0000) Subject: Merge r1599535, r1721685 from trunk: X-Git-Tag: 2.4.19~318 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a9fabb5beaeed9f47301ac031561f169e1630bb;p=thirdparty%2Fapache%2Fhttpd.git Merge r1599535, r1721685 from trunk: 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 document GlobalLog Submitted by: covener Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1722340 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 4f407e88060..3f351ddea93 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.4.19 + *) mod_log_config: Add GlobalLog to allow a globally defined log to + be inherited by virtual hosts that define a CustomLog. + [Edward Lu] Changes with Apache 2.4.18 diff --git a/STATUS b/STATUS index c467e019e12..7a0a178a450 100644 --- a/STATUS +++ b/STATUS @@ -112,13 +112,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - *) mod_log_config: PR58769: backport GlobalLog directive to 2.4.x - trunk patch: http://svn.apache.org/r1599535 - http://svn.apache.org/r1721685 - 2.4.x patch: trunk works - +1 covener, jim, ylavic - ylavic: note: the CHANGES entry may be modified to remove Ed's email - address (leaving the full name only) since he is now a committer. PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/docs/manual/mod/mod_log_config.xml b/docs/manual/mod/mod_log_config.xml index 59da6ea0308..527845e675d 100644 --- a/docs/manual/mod/mod_log_config.xml +++ b/docs/manual/mod/mod_log_config.xml @@ -585,4 +585,33 @@ TransferLog logs/access_log + +GlobalLog +Sets filename and format of log file +GlobalLog file|pipe|provider +format|nickname +[env=[!]environment-variable| +expr=expression] +server config + + + + +

The GlobalLog directive defines a log shared + by the main server configuration and all defined virtual hosts.

+ +

The GlobalLog directive is identical to + the CustomLog directive, apart from the following + differences:

+
    +
  • GlobalLog is not valid in virtual host + context.
  • +
  • GlobalLog is used by virtual hosts that + define their own CustomLog, unlike a + globally specified CustomLog.
  • +
+
+
+ + diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index 4dd140f60a6..b6dc9ff40b7 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -265,6 +265,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; @@ -1206,12 +1207,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); + } } } @@ -1336,6 +1340,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) { @@ -1360,6 +1391,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,