From: Jim Jagielski Date: Fri, 22 May 2015 13:24:18 +0000 (+0000) Subject: Merge r1680895, r1680900, r1680942 from trunk: X-Git-Tag: 2.4.13~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b53fbf8365c2f33cf53d86f413929bf3e296662;p=thirdparty%2Fapache%2Fhttpd.git Merge r1680895, r1680900, r1680942 from trunk: mod_log_config: instead of using the new dedicated pattern format "%M" for duration milliseconds, overload the existing "%D" to choose the time precision ("%{s}D" for seconds, "%{ms}D" for milliseconds and "%{us}D" for microseconds). The existing %T and %D without precision are kept for compatibility. The previously introduced "%M" (r1677187) is removed, it has not yet been released. Format pattern characters are rare, so we should only use a new one if an existing one isn't a good fit. Fix syntax. Follow-up to r1680895: Let %T be the format character which accepts time resolution arguments. Submitted by: rjung, trawick Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1681106 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e7b5e903124..1b69efde5f7 100644 --- a/CHANGES +++ b/CHANGES @@ -49,8 +49,9 @@ Changes with Apache 2.4.13 deprecation warnings, when encountered in a VirtualHost block. [Falco Schwarz ] - *) mod_log_config: Add %M format to output request duration in - milliseconds. [Ben Reser] + *) mod_log_config: Add "%{UNIT}T" format to output request duration in + seconds, milliseconds or microseconds depending on UNIT ("s", "ms", "us"). + [Ben Reser, Rainer Jung] *) Allow FallbackResource to work when a directory is requested and there is no autoindex nor DirectoryIndex. diff --git a/STATUS b/STATUS index 2b4203dbb2b..2d69669330e 100644 --- a/STATUS +++ b/STATUS @@ -113,21 +113,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: 2.4.x patch: trunk works (modulo CHANGES) +1: ylavic, minfrin, jkaluza, wrowe - *) mod_log_config: instead of using the dedicated pattern format "%M" for - duration milliseconds, overload the existing "%T" to choose the time - precision ("%{s}T" for seconds, "%{ms}T" for milliseconds and - "%{us}T" for microseconds). The existing %T and %D without precision - are kept for compatibility. The previously introduced "%M" is removed, - it has not yet been released. - Format pattern characters are rare, so we should only use a new one - if an existing one isn't a good fit. - trunk patch: http://svn.apache.org/r1680895 - http://svn.apache.org/r1680900 - http://svn.apache.org/r1680942 - 2.4.x patch: http://people.apache.org/~trawick/mod_log_config-r1680895-r1680900-r1680942-to-2.4.x.txt - (trunk works plus CHANGES) - +1: trawick, ylavic, wrowe, rjung - PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/docs/manual/mod/mod_log_config.xml b/docs/manual/mod/mod_log_config.xml index 5d1ad135060..59da6ea0308 100644 --- a/docs/manual/mod/mod_log_config.xml +++ b/docs/manual/mod/mod_log_config.xml @@ -146,10 +146,6 @@ %m The request method. - %M - The time taken to serve the request, in milliseconds. - (available in 2.4.13 and later) - %{VARNAME}n The contents of note VARNAME from another module. @@ -220,6 +216,15 @@ %T The time taken to serve the request, in seconds. + %{UNIT}T + The time taken to serve the request, in a time unit given by + UNIT. Valid units are ms for milliseconds, + us for microseconds, and s for seconds. + Using s gives the same result as %T + without any format; using us gives the same result + as %D. Combining %T with a unit is + available in 2.4.13 and later. + %u Remote user if the request was authenticated. May be bogus if return status (%s) is 401 (unauthorized). diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index db3d60bb022..d5687c2446b 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -101,7 +101,9 @@ * %...{format}t: The time, in the form given by format, which should * be in strftime(3) format. * %...T: the time taken to serve the request, in seconds. - * %...M: the time taken to serve the request, in milliseconds + * %...{s}T: the time taken to serve the request, in seconds, same as %T. + * %...{us}T: the time taken to serve the request, in micro seconds, same as %D. + * %...{ms}T: the time taken to serve the request, in milliseconds. * %...D: the time taken to serve the request, in micro seconds. * %...u: remote user (from auth; may be bogus if return status (%s) is 401) * %...U: the URL path requested. @@ -766,23 +768,28 @@ static const char *log_request_time(request_rec *r, char *a) } } -static const char *log_request_duration(request_rec *r, char *a) -{ - apr_time_t duration = get_request_end_time(r) - r->request_time; - return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, apr_time_sec(duration)); +static const char *log_request_duration_microseconds(request_rec *r, char *a) +{ + return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, + (get_request_end_time(r) - r->request_time)); } -static const char *log_request_duration_milliseconds(request_rec *r, char *a) +static const char *log_request_duration_scaled(request_rec *r, char *a) { apr_time_t duration = get_request_end_time(r) - r->request_time; - return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, apr_time_as_msec(duration)); -} - - -static const char *log_request_duration_microseconds(request_rec *r, char *a) -{ - return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, - (get_request_end_time(r) - r->request_time)); + if (*a == '\0' || !strcasecmp(a, "s")) { + duration = apr_time_sec(duration); + } + else if (!strcasecmp(a, "ms")) { + duration = apr_time_as_msec(duration); + } + else if (!strcasecmp(a, "us")) { + } + else { + /* bogus format */ + return a; + } + return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, duration); } /* These next two routines use the canonical name:port so that log @@ -1718,8 +1725,7 @@ static int log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) log_pfn_register(p, "k", log_requests_on_connection, 0); log_pfn_register(p, "r", log_request_line, 1); log_pfn_register(p, "D", log_request_duration_microseconds, 1); - log_pfn_register(p, "M", log_request_duration_milliseconds, 1); - log_pfn_register(p, "T", log_request_duration, 1); + log_pfn_register(p, "T", log_request_duration_scaled, 1); log_pfn_register(p, "U", log_request_uri, 1); log_pfn_register(p, "s", log_status, 1); log_pfn_register(p, "R", log_handler, 1);