This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 65475524cf Refactor access log time stamps to be based on 
request.getStartInstant()
65475524cf is described below

commit 65475524cf11d26412a2d30f376a578f5fb119ce
Author: Mark Thomas <[email protected]>
AuthorDate: Mon Sep 22 22:15:37 2025 +0100

    Refactor access log time stamps to be based on request.getStartInstant()
    
    This lays the foundation for addressing BZ 69817
    https://bz.apache.org/bugzilla/show_bug.cgi?id=69817
    
    There may also be scope for optimising time stamp generation
---
 .../catalina/valves/AbstractAccessLogValve.java    | 104 +++++++++------------
 .../catalina/valves/ExtendedAccessLogValve.java    |  60 ++++++------
 .../apache/catalina/valves/JsonAccessLogValve.java |   7 +-
 webapps/docs/changelog.xml                         |   4 +
 4 files changed, 83 insertions(+), 92 deletions(-)

diff --git a/java/org/apache/catalina/valves/AbstractAccessLogValve.java 
b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
index 10c3d013c2..01d2b93ac8 100644
--- a/java/org/apache/catalina/valves/AbstractAccessLogValve.java
+++ b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
@@ -21,6 +21,7 @@ import java.io.CharArrayWriter;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Enumeration;
@@ -422,11 +423,6 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
             ThreadLocal.withInitial(() -> new DateFormatCache(localCacheSize, 
Locale.getDefault(), globalDateCache));
 
 
-    /**
-     * The system time when we last updated the Date that this valve uses for 
log lines.
-     */
-    private static final ThreadLocal<Date> localDate = 
ThreadLocal.withInitial(Date::new);
-
     /**
      * Are we doing conditional logging ? default null. It is the value of 
<code>conditionUnless</code> property.
      */
@@ -675,16 +671,13 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
             return;
         }
 
-        // Date for access log should be the beginning of the request
-        Date date = getDate(request.getCoyoteRequest().getStartTime());
-
         CharArrayWriter result = charArrayWriters.pop();
         if (result == null) {
             result = new CharArrayWriter(128);
         }
 
         for (AccessLogElement logElement : logElements) {
-            logElement.addElement(result, date, request, response, time);
+            logElement.addElement(result, request, response, time);
         }
 
         log(result);
@@ -706,22 +699,6 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
 
     // -------------------------------------------------------- Private Methods
 
-    /**
-     * This method returns a Date object that is accurate to within one 
second. If a thread calls this method to get a
-     * Date, and it's been less than 1 second since a new Date was created, 
this method simply gives out the same Date
-     * again so that the system doesn't spend time creating Date objects 
unnecessarily.
-     *
-     * @param systime The time
-     *
-     * @return the date object
-     */
-    private static Date getDate(long systime) {
-        Date date = localDate.get();
-        date.setTime(systime);
-        return date;
-    }
-
-
     /**
      * Find a locale by name.
      *
@@ -749,7 +726,15 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      * AccessLogElement writes the partial message into the buffer.
      */
     protected interface AccessLogElement {
-        void addElement(CharArrayWriter buf, Date date, Request request, 
Response response, long time);
+        /**
+         * Called to create an access log entry.
+         *
+         * @param buf      The buffer to which the log element should be added
+         * @param request  The request that triggered this access log entry
+         * @param response The response to the request that triggered this 
access log entry
+         * @param time     The time taken in nanoseconds to process the request
+         */
+        void addElement(CharArrayWriter buf, Request request, Response 
response, long time);
     }
 
     /**
@@ -768,7 +753,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class ThreadNameElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             RequestInfo info = 
request.getCoyoteRequest().getRequestProcessor();
             if (info != null) {
                 buf.append(info.getWorkerThreadName());
@@ -802,7 +787,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             buf.append(localAddrValue);
         }
     }
@@ -839,7 +824,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             String value;
             if (remoteAddressType == RemoteAddressType.PEER) {
                 value = request.getPeerAddr();
@@ -879,7 +864,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected class HostElement implements AccessLogElement, CachedElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             String value = null;
             if (requestAttributesEnabled) {
                 Object host = request.getAttribute(REMOTE_HOST_ATTRIBUTE);
@@ -913,7 +898,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class LogicalUserNameElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             buf.append('-');
         }
     }
@@ -923,7 +908,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected class ProtocolElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (requestAttributesEnabled) {
                 Object proto = request.getAttribute(PROTOCOL_ATTRIBUTE);
                 if (proto == null) {
@@ -942,7 +927,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class UserElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (request != null) {
                 String value = request.getRemoteUser();
                 if (value != null) {
@@ -1085,24 +1070,24 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
-            long timestamp = date.getTime();
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
+            Instant requestStartInstant = 
Instant.from(request.getCoyoteRequest().getStartInstant());
             long frac;
             if (!usesBegin) {
-                timestamp += TimeUnit.NANOSECONDS.toMillis(time);
+                requestStartInstant.plusNanos(time);
             }
             switch (type) {
                 case CLF:
-                    buf.append(localDateCache.get().getFormat(timestamp));
+                    
buf.append(localDateCache.get().getFormat(requestStartInstant.toEpochMilli()));
                     break;
                 case SEC:
-                    buf.append(Long.toString(timestamp / 1000));
+                    
buf.append(Long.toString(requestStartInstant.getEpochSecond()));
                     break;
                 case MSEC:
-                    buf.append(Long.toString(timestamp));
+                    
buf.append(Long.toString(requestStartInstant.toEpochMilli()));
                     break;
                 case MSEC_FRAC:
-                    frac = timestamp % 1000;
+                    frac = requestStartInstant.toEpochMilli() % 1000;
                     if (frac < 100) {
                         buf.append('0');
                         if (frac < 10) {
@@ -1112,6 +1097,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
                     buf.append(Long.toString(frac));
                     break;
                 case SDF:
+                    long timestamp = requestStartInstant.toEpochMilli();
                     String temp = localDateCache.get().getFormat(format, 
locale, timestamp);
                     if (usesMsecs) {
                         frac = timestamp % 1000;
@@ -1141,7 +1127,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class RequestElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (request != null) {
                 String method = request.getMethod();
                 if (method == null) {
@@ -1169,7 +1155,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class HttpStatusCodeElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (response != null) {
                 // This approach is used to reduce GC from toString conversion
                 int status = response.getStatus();
@@ -1218,7 +1204,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (requestAttributesEnabled && portType == PortType.LOCAL) {
                 Object port = request.getAttribute(SERVER_PORT_ATTRIBUTE);
                 if (port == null) {
@@ -1257,7 +1243,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             // Don't need to flush since trigger for log message is after the
             // response has been committed
             long length = response.getBytesWritten(false);
@@ -1285,7 +1271,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class MethodElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (request != null) {
                 buf.append(request.getMethod());
             }
@@ -1365,7 +1351,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             style.append(buf, time);
         }
     }
@@ -1375,7 +1361,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class FirstByteTimeElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             long commitTime = 
response.getCoyoteResponse().getCommitTimeNanos();
             if (commitTime == -1) {
                 buf.append('-');
@@ -1391,7 +1377,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class QueryElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             String query = null;
             if (request != null) {
                 query = request.getQueryString();
@@ -1408,7 +1394,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class SessionIdElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (request == null) {
                 buf.append('-');
             } else {
@@ -1427,7 +1413,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class RequestURIElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (request != null) {
                 buf.append(request.getRequestURI());
             } else {
@@ -1441,7 +1427,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected class LocalServerNameElement implements AccessLogElement {
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             String value = null;
             if (requestAttributesEnabled) {
                 Object serverName = 
request.getAttribute(SERVER_NAME_ATTRIBUTE);
@@ -1474,7 +1460,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             buf.append(str);
         }
     }
@@ -1490,7 +1476,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             Enumeration<String> iter = request.getHeaders(header);
             if (iter.hasMoreElements()) {
                 escapeAndAppend(iter.nextElement(), buf);
@@ -1515,7 +1501,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             StringBuilder value = null;
             boolean first = true;
             Cookie[] cookies = request.getCookies();
@@ -1553,7 +1539,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (null != response) {
                 Iterator<String> iter = response.getHeaders(header).iterator();
                 if (iter.hasNext()) {
@@ -1580,7 +1566,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             Object value;
             if (request != null) {
                 value = request.getAttribute(attribute);
@@ -1610,7 +1596,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             Object value = null;
             if (null != request) {
                 HttpSession sess = request.getSession(false);
@@ -1637,7 +1623,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
      */
     protected static class ConnectionStatusElement implements AccessLogElement 
{
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (response != null && request != null) {
                 boolean statusFound = false;
 
@@ -1700,7 +1686,7 @@ public abstract class AbstractAccessLogValve extends 
ValveBase implements Access
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             switch (identifierType) {
                 case CONNECTION:
                     
buf.append(request.getServletConnection().getConnectionId());
diff --git a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java 
b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
index 3516ddd1ad..977c921f05 100644
--- a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
+++ b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java
@@ -145,11 +145,12 @@ public class ExtendedAccessLogValve extends 
AccessLogValve {
                 ThreadLocal.withInitial(() -> new 
ElementTimestampStruct("yyyy-MM-dd"));
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             ElementTimestampStruct eds = currentDate.get();
             long millis = eds.currentTimestamp.getTime();
-            if (date.getTime() > (millis + INTERVAL - 1) || date.getTime() < 
millis) {
-                eds.currentTimestamp.setTime(date.getTime() - (date.getTime() 
% INTERVAL));
+            long epochMilli = 
request.getCoyoteRequest().getStartInstant().toEpochMilli();
+            if (epochMilli > (millis + INTERVAL - 1) || epochMilli < millis) {
+                eds.currentTimestamp.setTime(epochMilli - (epochMilli % 
INTERVAL));
                 eds.currentTimestampString = 
eds.currentTimestampFormat.format(eds.currentTimestamp);
             }
             buf.append(eds.currentTimestampString);
@@ -164,11 +165,12 @@ public class ExtendedAccessLogValve extends 
AccessLogValve {
                 ThreadLocal.withInitial(() -> new 
ElementTimestampStruct("HH:mm:ss"));
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             ElementTimestampStruct eds = currentTime.get();
             long millis = eds.currentTimestamp.getTime();
-            if (date.getTime() > (millis + INTERVAL - 1) || date.getTime() < 
millis) {
-                eds.currentTimestamp.setTime(date.getTime() - (date.getTime() 
% INTERVAL));
+            long epochMilli = 
request.getCoyoteRequest().getStartInstant().toEpochMilli();
+            if (epochMilli > (millis + INTERVAL - 1) || epochMilli < millis) {
+                eds.currentTimestamp.setTime(epochMilli - (epochMilli % 
INTERVAL));
                 eds.currentTimestampString = 
eds.currentTimestampFormat.format(eds.currentTimestamp);
             }
             buf.append(eds.currentTimestampString);
@@ -183,7 +185,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             wrap(request.getHeader(header), buf);
         }
     }
@@ -196,7 +198,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             wrap(response.getHeader(header), buf);
         }
     }
@@ -209,7 +211,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             
wrap(request.getContext().getServletContext().getAttribute(attribute), buf);
         }
     }
@@ -222,7 +224,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             StringBuilder value = new StringBuilder();
             boolean first = true;
             Cookie[] c = request.getCookies();
@@ -255,7 +257,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             if (null != response) {
                 Iterator<String> iter = response.getHeaders(header).iterator();
                 if (iter.hasNext()) {
@@ -287,7 +289,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             wrap(request.getAttribute(attribute), buf);
         }
     }
@@ -300,7 +302,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             HttpSession session;
             if (request != null) {
                 session = request.getSession(false);
@@ -329,7 +331,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             String parameterValue;
             try {
                 parameterValue = request.getParameter(parameter);
@@ -550,7 +552,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
                 if ("ip".equals(nextToken)) {
                     return new LocalAddrElement(getIpv6Canonical());
                 } else if ("dns".equals(nextToken)) {
-                    return (buf, date, req, res, l) -> {
+                    return (buf, req, res, l) -> {
                         String value;
                         try {
                             value = InetAddress.getLocalHost().getHostName();
@@ -592,7 +594,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
                     if ("stem".equals(token)) {
                         return new RequestURIElement();
                     } else if ("query".equals(token)) {
-                        return (buf, date, request, res, l) -> {
+                        return (buf, request, res, l) -> {
                             String query = request.getQueryString();
                             if (query != null) {
                                 buf.append(query);
@@ -602,7 +604,7 @@ public class ExtendedAccessLogValve extends AccessLogValve {
                         };
                     }
                 } else {
-                    return (buf, date, request, res, l) -> {
+                    return (buf, request, res, l) -> {
                         String query = request.getQueryString();
                         buf.append(request.getRequestURI());
                         if (query != null) {
@@ -707,41 +709,41 @@ public class ExtendedAccessLogValve extends 
AccessLogValve {
     protected AccessLogElement getServletRequestElement(String parameter) {
         switch (parameter) {
             case "authType" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getAuthType(), buf);
+                return (buf, request, res, l) -> wrap(request.getAuthType(), 
buf);
             }
             case "remoteUser" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getRemoteUser(), buf);
+                return (buf, request, res, l) -> wrap(request.getRemoteUser(), 
buf);
             }
             case "requestedSessionId" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getRequestedSessionId(), buf);
+                return (buf, request, res, l) -> 
wrap(request.getRequestedSessionId(), buf);
             }
             case "requestedSessionIdFromCookie" -> {
-                return (buf, date, request, res, l) -> 
wrap(String.valueOf(request.isRequestedSessionIdFromCookie()),
+                return (buf, request, res, l) -> 
wrap(String.valueOf(request.isRequestedSessionIdFromCookie()),
                         buf);
             }
             case "requestedSessionIdValid" -> {
-                return (buf, date, request, res, l) -> 
wrap(String.valueOf(request.isRequestedSessionIdValid()), buf);
+                return (buf, request, res, l) -> 
wrap(String.valueOf(request.isRequestedSessionIdValid()), buf);
             }
             case "contentLength" -> {
-                return (buf, date, request, res, l) -> 
wrap(String.valueOf(request.getContentLengthLong()), buf);
+                return (buf, request, res, l) -> 
wrap(String.valueOf(request.getContentLengthLong()), buf);
             }
             case "connectionId" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getServletConnection().getConnectionId(), buf);
+                return (buf, request, res, l) -> 
wrap(request.getServletConnection().getConnectionId(), buf);
             }
             case "characterEncoding" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getCharacterEncoding(), buf);
+                return (buf, request, res, l) -> 
wrap(request.getCharacterEncoding(), buf);
             }
             case "locale" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getLocale(), buf);
+                return (buf, request, res, l) -> wrap(request.getLocale(), 
buf);
             }
             case "protocol" -> {
-                return (buf, date, request, res, l) -> 
wrap(request.getProtocol(), buf);
+                return (buf, request, res, l) -> wrap(request.getProtocol(), 
buf);
             }
             case "scheme" -> {
-                return (buf, date, request, res, l) -> 
buf.append(request.getScheme());
+                return (buf, request, res, l) -> 
buf.append(request.getScheme());
             }
             case "secure" -> {
-                return (buf, date, request, res, l) -> 
wrap(Boolean.valueOf(request.isSecure()), buf);
+                return (buf, request, res, l) -> 
wrap(Boolean.valueOf(request.isSecure()), buf);
             }
             case null, default -> {
                 
log.error(sm.getString("extendedAccessLogValve.badXParamValue", parameter));
diff --git a/java/org/apache/catalina/valves/JsonAccessLogValve.java 
b/java/org/apache/catalina/valves/JsonAccessLogValve.java
index 7c54506a73..9932d81a60 100644
--- a/java/org/apache/catalina/valves/JsonAccessLogValve.java
+++ b/java/org/apache/catalina/valves/JsonAccessLogValve.java
@@ -20,7 +20,6 @@ import java.io.CharArrayWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
@@ -125,7 +124,7 @@ public class JsonAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             buf.write(ch);
         }
     }
@@ -256,12 +255,12 @@ public class JsonAccessLogValve extends AccessLogValve {
         }
 
         @Override
-        public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
+        public void addElement(CharArrayWriter buf, Request request, Response 
response, long time) {
             buf.append('"').append(attributeName).append('"').append(':');
             if (quoteValue) {
                 buf.append('"');
             }
-            delegate.addElement(buf, date, request, response, time);
+            delegate.addElement(buf, request, response, time);
             if (quoteValue) {
                 buf.append('"');
             }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index d075806c63..51d4fd6817 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -189,6 +189,10 @@
       <fix>
         Further performance improvements for ParameterMap. (jengebr/markt)
       </fix>
+      <scode>
+        Refactor access log time stamps to be based on the <code>Instant</code>
+        request processing starts. (markt)
+      </scode>
     </changelog>
   </subsection>
   <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to