diff --git a/java/org/apache/catalina/valves/AbstractAccessLogValve.java b/java/org/apache/catalina/valves/AbstractAccessLogValve.java index 360c1ebbd91c..8c1231d1936f 100644 --- a/java/org/apache/catalina/valves/AbstractAccessLogValve.java +++ b/java/org/apache/catalina/valves/AbstractAccessLogValve.java @@ -2155,6 +2155,20 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) { return new RemoteAddrElement(name); case 'c': return new CookieElement(name); + case 'D': + if ("ns".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.NANOSECONDS); + } else if ("us".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS); + } else if ("ms".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS); + } else if ("s".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); + } else if ("fracsec".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL); + } else { + return new StringElement("???" + name + "???"); + } case 'i': return new HeaderElement(name); case 'L': @@ -2180,10 +2194,12 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) { return new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS); } else if ("ms".equals(name)) { return new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS); + } else if ("s".equals(name)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); } else if ("fracsec".equals(name)) { return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL); } else { - return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); + return new StringElement("???" + name + "???"); } default: return new StringElement("???"); @@ -2199,6 +2215,8 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) { */ protected AccessLogElement createAccessLogElement(char pattern) { switch (pattern) { + case '%': + return new StringElement("%"); case 'a': return new RemoteAddrElement(); case 'A': diff --git a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java index 2bdb9f1ac7fc..ef272c1d0ad4 100644 --- a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java +++ b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java @@ -518,10 +518,12 @@ protected AccessLogElement getLogElement(String token, PatternTokenizer tokenize return new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS); } else if ("ms".equals(nextToken)) { return new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS); + } else if ("s".equals(nextToken)) { + return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); } else if ("fracsec".equals(nextToken)) { return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL); } else { - return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); + return new StringElement("???" + nextToken + "???"); } } else { return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS); diff --git a/test/org/apache/catalina/valves/TestAccessLogValve.java b/test/org/apache/catalina/valves/TestAccessLogValve.java index 49784e642118..08e5630252f0 100644 --- a/test/org/apache/catalina/valves/TestAccessLogValve.java +++ b/test/org/apache/catalina/valves/TestAccessLogValve.java @@ -90,6 +90,7 @@ public class TestAccessLogValve extends TomcatBaseTest { public static Collection parameters() { List parameterSets = new ArrayList<>(); + parameterSets.add(new Object[] {"pct-pct", TEXT_TYPE, "/", "%%", "%"}); parameterSets.add(new Object[] {"pct-a", TEXT_TYPE, "/", "%a", LOCAL_IP_PATTERN}); parameterSets.add(new Object[] {"pct-a", JSON_TYPE, "/", "%a", "\\{\"remoteAddr\":\"" + LOCAL_IP_PATTERN + "\"\\}"}); parameterSets.add(new Object[] {"pct-A", TEXT_TYPE, "/", "%A", IP_PATTERN}); diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index bd8a956041f2..a2e1f1e9d562 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -178,6 +178,10 @@ Ensure RealmBase finds all matching extension based security constraints. (markt) + + Add %% in AccessLogValve pattern. Align %{xxx}D modifiers with %{xxx}T. + Pull request 1003 provided by effhaa. + @@ -5658,4 +5662,3 @@ - diff --git a/webapps/docs/config/valve.xml b/webapps/docs/config/valve.xml index fb19da1ce854..6ad322e86ca9 100644 --- a/webapps/docs/config/valve.xml +++ b/webapps/docs/config/valve.xml @@ -282,6 +282,7 @@ the current request and response. The following pattern codes are supported:

    +
  • %% - Literal '%' character
  • %a - Remote IP address. See also %{xxx}a below.
  • %A - Local IP address