Author: jorton
Date: Tue Jun 2 13:54:17 2026
New Revision: 1934884
Log:
Merge r1931452, r1931453 from trunk:
core: Add millisecond support to ErrorLogFormat time specifiers
%{m} prints the timestamp in millisecond-resolution.
* include/util_time.h:
Define new AP_CTIME_OPTION_MSEC option for printing time in milliseconds
format.
* server/util_time.c (ap_recent_ctime_ex):
Handle AP_CTIME_OPTION_MSEC to print time in a millisecond format.
* server/log.c (log_ctime):
Recognize the m time option in both fast-path and composite %{...}t formats.
Submitted by: Luboš Uhliarik <luhliari redhat.com>
* server/log.c (log_ctime): Fix syntax error in r1931452
(added by me when tweaking whitespace, not from the PR author).
Reviewed by: jorton, covener, jim
Github: closes #599
Added:
httpd/httpd/branches/2.4.x/changes-entries/log-msec.txt (contents, props changed)
Modified:
httpd/httpd/branches/2.4.x/ (props changed)
httpd/httpd/branches/2.4.x/docs/manual/mod/core.xml
httpd/httpd/branches/2.4.x/include/util_time.h
httpd/httpd/branches/2.4.x/server/log.c
httpd/httpd/branches/2.4.x/server/util_time.c
Added: httpd/httpd/branches/2.4.x/changes-entries/log-msec.txt
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ httpd/httpd/branches/2.4.x/changes-entries/log-msec.txt Tue Jun 2 13:54:17 2026 (r1934884)
@@ -0,0 +1,3 @@
+ *) core: Add support for %{m}t in ErrorLogFormat to log milli-second
+ time resolution (in addition to existing %{u}t for micro-seconds).
+ [Luboš Uhliarik <luhliari redhat.com>]
Modified: httpd/httpd/branches/2.4.x/docs/manual/mod/core.xml
==============================================================================
--- httpd/httpd/branches/2.4.x/docs/manual/mod/core.xml Tue Jun 2 13:28:23 2026 (r1934883)
+++ httpd/httpd/branches/2.4.x/docs/manual/mod/core.xml Tue Jun 2 13:54:17 2026 (r1934884)
@@ -1795,6 +1795,9 @@ ErrorLogFormat "[%t] [%l] [pid %P] %F: %
<tr><td><code>%{u}t</code></td>
<td>The current time including micro-seconds</td></tr>
+ <tr><td><code>%{m}t</code></td>
+ <td>The current time including milliseconds</td></tr>
+
<tr><td><code>%{cu}t</code></td>
<td>The current time in ISO 8601 extended format (compact), including
micro-seconds</td></tr>
Modified: httpd/httpd/branches/2.4.x/include/util_time.h
==============================================================================
--- httpd/httpd/branches/2.4.x/include/util_time.h Tue Jun 2 13:28:23 2026 (r1934883)
+++ httpd/httpd/branches/2.4.x/include/util_time.h Tue Jun 2 13:54:17 2026 (r1934884)
@@ -49,6 +49,8 @@ extern "C" {
#define AP_CTIME_OPTION_COMPACT 0x2
/* Add timezone offset from GMT ([+-]hhmm) */
#define AP_CTIME_OPTION_GMTOFF 0x4
+/* Add sub second timestamps with millisecond resolution */
+#define AP_CTIME_OPTION_MSEC 0x8
/**
Modified: httpd/httpd/branches/2.4.x/server/log.c
==============================================================================
--- httpd/httpd/branches/2.4.x/server/log.c Tue Jun 2 13:28:23 2026 (r1934883)
+++ httpd/httpd/branches/2.4.x/server/log.c Tue Jun 2 13:54:17 2026 (r1934884)
@@ -664,9 +664,15 @@ static int log_ctime(const ap_errorlog_i
if (arg[0] == 'u' && !arg[1]) { /* no ErrorLogFormat (fast path) */
option |= AP_CTIME_OPTION_USEC;
}
- else if (!ap_strchr_c(arg, '%')) { /* special "%{cuz}t" formats */
+ else if (arg[0] == 'm' && !arg[1]) { /* no ErrorLogFormat (fast path) - msec */
+ option |= AP_CTIME_OPTION_MSEC;
+ }
+ else if (!ap_strchr_c(arg, '%')) { /* special "%{mcuz}t" formats */
while (*arg) {
switch (*arg++) {
+ case 'm':
+ option |= AP_CTIME_OPTION_MSEC;
+ break;
case 'u':
option |= AP_CTIME_OPTION_USEC;
break;
Modified: httpd/httpd/branches/2.4.x/server/util_time.c
==============================================================================
--- httpd/httpd/branches/2.4.x/server/util_time.c Tue Jun 2 13:28:23 2026 (r1934883)
+++ httpd/httpd/branches/2.4.x/server/util_time.c Tue Jun 2 13:54:17 2026 (r1934884)
@@ -22,6 +22,11 @@
* */
#define AP_CTIME_USEC_LENGTH 7
+/* Number of characters needed to format the millisecond part of a timestamp.
+ * Milliseconds have 3 digits plus one separator character makes 4.
+ * */
+#define AP_CTIME_MSEC_LENGTH 4
+
/* Length of ISO 8601 date/time (including trailing '\0') */
#define AP_CTIME_COMPACT_LEN 20
@@ -182,6 +187,9 @@ AP_DECLARE(apr_status_t) ap_recent_ctime
if (option & AP_CTIME_OPTION_USEC) {
needed += AP_CTIME_USEC_LENGTH;
}
+ else if (option & AP_CTIME_OPTION_MSEC) {
+ needed += AP_CTIME_MSEC_LENGTH;
+ }
if (option & AP_CTIME_OPTION_GMTOFF) {
needed += AP_CTIME_GMTOFF_LEN;
@@ -242,11 +250,16 @@ AP_DECLARE(apr_status_t) ap_recent_ctime
*date_str++ = ':';
*date_str++ = xt.tm_sec / 10 + '0';
*date_str++ = xt.tm_sec % 10 + '0';
- if (option & AP_CTIME_OPTION_USEC) {
+ if (option & (AP_CTIME_OPTION_USEC|AP_CTIME_OPTION_MSEC)) {
int div;
int usec = (int)xt.tm_usec;
*date_str++ = '.';
- for (div=100000; div>0; div=div/10) {
+ div = 100000;
+ if (!(option & AP_CTIME_OPTION_USEC)) {
+ usec = usec / 1000;
+ div = 100;
+ }
+ for (; div>0; div=div/10) {
*date_str++ = usec / div + '0';
usec = usec % div;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.