You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Ruediger Pluem <rp...@apache.org> on 2010/09/06 09:30:26 UTC
Re: svn commit: r992806 - in /httpd/httpd/trunk: ./ docs/manual/
docs/manual/mod/ include/ modules/loggers/ server/
On 09/05/2010 05:44 PM, sf@apache.org wrote:
> Author: sf
> Date: Sun Sep 5 15:44:19 2010
> New Revision: 992806
>
> URL: http://svn.apache.org/viewvc?rev=992806&view=rev
> Log:
> Add ErrorLogFormat directive for configuring the error log format, including
> additional information that is logged once per connection or request.
>
> Add error log IDs for connections and request to allow correlating error log
> lines and the corresponding access log entry.
>
> Modified:
> httpd/httpd/trunk/CHANGES
> httpd/httpd/trunk/STATUS
> httpd/httpd/trunk/docs/manual/logs.xml
> httpd/httpd/trunk/docs/manual/mod/core.xml
> httpd/httpd/trunk/docs/manual/mod/mod_log_config.xml
> httpd/httpd/trunk/include/ap_mmn.h
> httpd/httpd/trunk/include/http_config.h
> httpd/httpd/trunk/include/http_core.h
> httpd/httpd/trunk/include/httpd.h
> httpd/httpd/trunk/include/util_time.h
> httpd/httpd/trunk/modules/loggers/mod_log_config.c
> httpd/httpd/trunk/server/config.c
> httpd/httpd/trunk/server/core.c
> httpd/httpd/trunk/server/log.c
> httpd/httpd/trunk/server/util_time.c
>
>
> Modified: httpd/httpd/trunk/server/core.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/core.c?rev=992806&r1=992805&r2=992806&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/core.c (original)
> +++ httpd/httpd/trunk/server/core.c Sun Sep 5 15:44:19 2010
> +static apr_array_header_t *parse_errorlog_string(apr_pool_t *p,
> + const char *s,
> + const char **err,
> + int want_msg_fmt)
> +{
> + apr_array_header_t *a = apr_array_make(p, 30,
> + sizeof(ap_errorlog_format_item));
> + char *res;
> + int seen_msg_fmt = 0;
> +
> + while (s && *s) {
> + ap_errorlog_format_item *item =
> + (ap_errorlog_format_item *)apr_array_push(a);
> + memset(item, 0, sizeof(*item));
> + res = parse_errorlog_item(p, item, &s);
> + if (res) {
> + *err = res;
> + return NULL;
> + }
> + if (item->flags & AP_ERRORLOG_FLAG_MESSAGE) {
> + if (!want_msg_fmt) {
> + *err = "%M cannot be used in once-per-request or "
> + "once-per-connection formats";
> + return NULL;
> + }
> + seen_msg_fmt = 1;
> + }
> + }
> +
> + if (want_msg_fmt && !seen_msg_fmt) {
> + *err = "main ErrorLogFormat must contain message format string '%M'";
> + return NULL;
> + }
> +
> + return a;
> +}
> +
> +static const char *set_errorlog_format(cmd_parms *cmd, void *dummy,
> + const char *arg1, const char *arg2)
> +{
> + const char *err_string = NULL;
> + core_server_config *conf = ap_get_module_config(cmd->server->module_config,
> + &core_module);
> +
> + if (!arg2) {
> + conf->error_log_format = parse_errorlog_string(cmd->pool, arg1,
> + &err_string, 1);
> + }
> + else if (!strcasecmp(arg1, "connection")) {
> + if (!conf->error_log_conn) {
> + conf->error_log_conn = apr_array_make(cmd->pool, 5,
> + sizeof(apr_array_header_t *));
> + }
> +
> + if (arg2 && *arg2) {
arg2 is always != NULL.
> + apr_array_header_t **e;
> + e = (apr_array_header_t **) apr_array_push(conf->error_log_conn);
> + *e = parse_errorlog_string(cmd->pool, arg2, &err_string, 0);
> + }
> + }
> + else if (!strcasecmp(arg1, "request")) {
> + if (!conf->error_log_req) {
> + conf->error_log_req = apr_array_make(cmd->pool, 5,
> + sizeof(apr_array_header_t *));
> + }
> +
> + if (arg2 && *arg2) {
arg2 is always != NULL.
> + apr_array_header_t **e;
> + e = (apr_array_header_t **) apr_array_push(conf->error_log_req);
> + *e = parse_errorlog_string(cmd->pool, arg2, &err_string, 0);
> + }
> + }
> + else {
> + err_string = "ErrorLogFormat type must be one of request, connection";
> + }
> +
> + return err_string;
> +}
> +
> +AP_DECLARE(void) ap_register_errorlog_handler(apr_pool_t *p, char *tag,
> + ap_errorlog_handler_fn_t *handler,
> + int flags)
> +{
> + ap_errorlog_handler *log_struct = apr_palloc(p, sizeof(*log_struct));
> + log_struct->func = handler;
> + log_struct->flags = flags;
> +
> + apr_hash_set(errorlog_hash, tag, 1, (const void *)log_struct);
> +}
> +
> +
> /* Note --- ErrorDocument will now work from .htaccess files.
> * The AllowOverride of Fileinfo allows webmasters to turn it off
> */
> Modified: httpd/httpd/trunk/server/log.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/log.c?rev=992806&r1=992805&r2=992806&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/log.c (original)
> +++ httpd/httpd/trunk/server/log.c Sun Sep 5 15:44:19 2010
> @@ -677,75 +704,303 @@ static void log_error_core(const char *f
> file = p + 1;
> }
> #endif /*_OSD_POSIX || WIN32 */
> - len += apr_snprintf(errstr + len, MAX_STRING_LEN - len,
> - "%s(%d): ", file, line);
> + return apr_snprintf(buf, buflen, "%s(%d)", file, info->line);
> + }
> +}
> +
> +static int log_apr_status(const ap_errorlog_info *info, const char *arg,
> + char *buf, int buflen)
> +{
> + apr_status_t status = info->status;
> + int len = 0;
> + if (!status)
> + return 0;
> +
> + if (status < APR_OS_START_EAIERR) {
> + len += apr_snprintf(buf + len, buflen - len,
len is always 0. Why this + and -?
> + "(%d)", status);
> + }
> + else if (status < APR_OS_START_SYSERR) {
> + len += apr_snprintf(buf + len, buflen - len,
> + "(EAI %d)", status - APR_OS_START_EAIERR);
len is always 0. Why this + and -?
> + }
> + else if (status < 100000 + APR_OS_START_SYSERR) {
> + len += apr_snprintf(buf + len, buflen - len,
> + "(OS %d)", status - APR_OS_START_SYSERR);
len is always 0. Why this + and -?
> }
> + else {
> + len += apr_snprintf(buf + len, buflen - len,
> + "(os 0x%08x)", status - APR_OS_START_SYSERR);
> + }
> + apr_strerror(status, buf + len, buflen - len);
> + len += strlen(buf + len);
> + return len;
> +}
> +
> +static int log_header(const ap_errorlog_info *info, const char *arg,
> + char *buf, int buflen)
> +{
> +
> + /*
> + * The apr-util docs wrongly states encoded strings are not 0-terminated.
> + * Let's be save and allocate an additional byte.
> + */
> + len = 1 + apr_base64_encode_len(sizeof(id));
> + encoded = apr_palloc(r ? r->pool : c->pool, len);
> + apr_base64_encode(encoded, (char *)&id, sizeof(id));
> + encoded[11] = '\0'; /* omit last char which is always '=' */
Why 11 and not len?
> +
> + /* need to cast const away */
> + if (r) {
> + ((request_rec *)r)->log_id = encoded;
> + }
> + else {
> + ((conn_rec *)c)->log_id = encoded;
> + }
> +}
> +
> +/*
> + * This is used if no error log format is defined and during startup.
> + * It automatically omits the timestamp if logging to syslog.
> + */
> +static int do_errorlog_default(const ap_errorlog_info *info, char *buf,
> + int buflen, int *errstr_start, int *errstr_end,
> + const char *errstr_fmt, va_list args)
Regards
RĂ¼diger
Re: svn commit: r992806 - in /httpd/httpd/trunk: ./ docs/manual/
docs/manual/mod/ include/ modules/loggers/ server/
Posted by Ruediger Pluem <rp...@apache.org>.
On 09/06/2010 09:00 PM, Stefan Fritsch wrote:
> On Monday 06 September 2010, Ruediger Pluem wrote:
>>> +
>>> + /*
>>> + * The apr-util docs wrongly states encoded strings are not 0-terminated.
>>> + * Let's be save and allocate an additional byte.
>>> + */
>>> + len = 1 + apr_base64_encode_len(sizeof(id));
>>> + encoded = apr_palloc(r ? r->pool : c->pool, len);
>>> + apr_base64_encode(encoded, (char *)&id, sizeof(id));
>>> + encoded[11] = '\0'; /* omit last char which is always '=' */
>> Why 11 and not len?
>
> I didn't want to depend on wether apr_base64_encode_len() includes
> the terminating \0 or not. But as I am APR committer now, too, I
> should probably fix the docs instead.
>
> Besides, it would have been encoded[len-3] or encoded[len-2] which
> is IMHO even less readable than encoded[11].
Given your latest comment (that you do not need the '=') IMHO
encoded[len-3] or encoded[len-2] is more readable then encoded[11].
>
> I have commited all your other suggestions.
Thanks.
Regards
RĂ¼diger
Re: svn commit: r992806 - in /httpd/httpd/trunk: ./ docs/manual/ docs/manual/mod/ include/ modules/loggers/ server/
Posted by Stefan Fritsch <sf...@sfritsch.de>.
On Monday 06 September 2010, Ruediger Pluem wrote:
> > +
> > + /*
> > + * The apr-util docs wrongly states encoded strings are not 0-terminated.
> > + * Let's be save and allocate an additional byte.
> > + */
> > + len = 1 + apr_base64_encode_len(sizeof(id));
> > + encoded = apr_palloc(r ? r->pool : c->pool, len);
> > + apr_base64_encode(encoded, (char *)&id, sizeof(id));
> > + encoded[11] = '\0'; /* omit last char which is always '=' */
>
> Why 11 and not len?
I didn't want to depend on wether apr_base64_encode_len() includes
the terminating \0 or not. But as I am APR committer now, too, I
should probably fix the docs instead.
Besides, it would have been encoded[len-3] or encoded[len-2] which
is IMHO even less readable than encoded[11].
I have commited all your other suggestions.
Cheers,
Stefan