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:
</usage>
</directivesynopsis>
+<directivesynopsis>
+<name>GlobalLog</name>
+<description>Sets filename and format of log file</description>
+<syntax>GlobalLog <var>file</var>|<var>pipe</var>|<var>provider</var>
+<var>format</var>|<var>nickname</var>
+[env=[!]<var>environment-variable</var>|
+expr=<var>expression</var>]</syntax>
+<contextlist><context>server config</context>
+</contextlist>
+
+<usage>
+
+ <p>The <directive>GlobalLog</directive> directive defines a log shared
+ by the main server configuration and all defined virtual hosts.</p>
+
+ <p>The <directive>GlobalLog</directive> directive is identical to
+ the <directive>CustomLog</directive> directive, apart from the following
+ differences:</p>
+ <ul>
+ <li><directive>GlobalLog</directive> is not valid in virtual host
+ context.</li>
+ <li><directive>GlobalLog</directive> is used by virtual hosts that
+ define their own <directive>CustomLog</directive>, unlike a
+ globally specified <directive>CustomLog</directive>.</li>
+ </ul>
+</usage>
+</directivesynopsis>
+
+
</modulesynopsis>
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;
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);
+ }
}
}
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)
{
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,