Commit cb00fcf8 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

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 <Chaosed0 gmail.com>
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
parent b9593031
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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

+0 −7
Original line number Diff line number Diff line
@@ -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:
+29 −0
Original line number Diff line number Diff line
@@ -585,4 +585,33 @@ TransferLog logs/access_log
</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>
+35 −2
Original line number Diff line number Diff line
@@ -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,14 +1207,17 @@ 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];

            if (cls->inherit || !mls->config_logs->nelts) {
                config_log_transaction(r, cls, mls->default_format);
            }
        }
    }

    return OK;
}
@@ -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,