Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions java/org/apache/catalina/valves/AbstractAccessLogValve.java
Original file line number Diff line number Diff line change
Expand Up @@ -1578,17 +1578,6 @@ public ElapsedTimeElement(Style style) {
this.style = style;
}

/**
* Creates a new ElapsedTimeElement that will log the time in the specified style.
*
* @param micros <code>true</code>, write time in microseconds - %D
* @param millis <code>true</code>, write time in milliseconds, if both arguments are <code>false</code>, write
* time in seconds - %T
*/
public ElapsedTimeElement(boolean micros, boolean millis) {
this(micros ? Style.MICROSECONDS : millis ? Style.MILLISECONDS : Style.SECONDS);
}

@Override
public void addElement(CharArrayWriter buf, Request request, Response response, long time) {
style.append(buf, time);
Expand Down Expand Up @@ -2115,6 +2104,15 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) {
return switch (pattern) {
case 'a' -> new RemoteAddrElement(name);
case 'c' -> new CookieElement(name);
case 'D' ->
switch (name) {
case "ns" -> new ElapsedTimeElement(ElapsedTimeElement.Style.NANOSECONDS);
case "ms" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS);
case "us" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS);
case "s" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
case "fracsec" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL);
case null, default -> new StringElement("???" + name + "???");
};
case 'i' -> new HeaderElement(name);
case 'L' -> new IdentifierElement(name);
case 'o' -> new ResponseHeaderElement(name);
Expand All @@ -2133,8 +2131,9 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) {
case "ns" -> new ElapsedTimeElement(ElapsedTimeElement.Style.NANOSECONDS);
case "us" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS);
case "ms" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS);
case "s" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
case "fracsec" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL);
case null, default -> new ElapsedTimeElement(false, false);
case null, default -> new StringElement("???" + name + "???");
};
default -> new StringElement("???");
};
Expand All @@ -2149,11 +2148,12 @@ protected AccessLogElement createAccessLogElement(String name, char pattern) {
*/
protected AccessLogElement createAccessLogElement(char pattern) {
return switch (pattern) {
case '%' -> new StringElement("%");
case 'a' -> new RemoteAddrElement();
case 'A' -> new LocalAddrElement(ipv6Canonical);
case 'b' -> new ByteSentElement(true);
case 'B' -> new ByteSentElement(false);
case 'D' -> new ElapsedTimeElement(true, false);
case 'D' -> new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS);
case 'F' -> new FirstByteTimeElement();
case 'h' -> new HostElement();
case 'H' -> new ProtocolElement();
Expand All @@ -2165,7 +2165,7 @@ protected AccessLogElement createAccessLogElement(char pattern) {
case 's' -> new HttpStatusCodeElement();
case 'S' -> new SessionIdElement();
case 't' -> new DateAndTimeElement();
case 'T' -> new ElapsedTimeElement(false, false);
case 'T' -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
case 'u' -> new UserElement();
case 'U' -> new RequestURIElement();
case 'v' -> new LocalServerNameElement();
Expand Down
3 changes: 2 additions & 1 deletion java/org/apache/catalina/valves/ExtendedAccessLogValve.java
Original file line number Diff line number Diff line change
Expand Up @@ -518,8 +518,9 @@ protected AccessLogElement getLogElement(String token, PatternTokenizer tokenize
case "ns" -> new ElapsedTimeElement(ElapsedTimeElement.Style.NANOSECONDS);
case "us" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MICROSECONDS);
case "ms" -> new ElapsedTimeElement(ElapsedTimeElement.Style.MILLISECONDS);
case "s" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
case "fracsec" -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS_FRACTIONAL);
case null, default -> new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
case null, default -> new StringElement("???" + nextToken + "???");
};
} else {
return new ElapsedTimeElement(ElapsedTimeElement.Style.SECONDS);
Expand Down
1 change: 1 addition & 0 deletions test/org/apache/catalina/valves/TestAccessLogValve.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ public class TestAccessLogValve extends TomcatBaseTest {
public static Collection<Object[]> parameters() {
List<Object[]> 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});
Expand Down
7 changes: 5 additions & 2 deletions webapps/docs/changelog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,10 @@
<code>false</code>, meaning user names are treated in a case insensitive
manner. (markt)
</add>
<add>
Add <code>%%</code> in AccessLogValve pattern. Align <code>%{xxx}D</code> modifiers with <code>%{xxx}T</code>.
Pull request <pr>1002</pr> provided by effhaa.
</add>
</changelog>
</subsection>
<subsection name="Coyote">
Expand Down Expand Up @@ -358,7 +362,7 @@
</add>
<add>
Extend the existing <code>+=</code> operator in Jakarta Expression
Language to support merging <code>Map</code>Map and <code>Set</code>Set
Language to support merging <code>Map</code> and <code>Set</code>
and concatenating <code>List</code>s. (markt)
</add>
<update>
Expand Down Expand Up @@ -494,4 +498,3 @@
</section>
</body>
</document>

3 changes: 2 additions & 1 deletion webapps/docs/config/valve.xml
Original file line number Diff line number Diff line change
Expand Up @@ -282,12 +282,13 @@
the current request and response. The following pattern codes are
supported:</p>
<ul>
<li><b><code>%%</code></b> - Literal '%' character</li>
<li><b><code>%a</code></b> - Remote IP address.
See also <code>%{xxx}a</code> below.</li>
<li><b><code>%A</code></b> - Local IP address</li>
<li><b><code>%b</code></b> - Bytes sent, excluding HTTP headers, or '-' if zero</li>
<li><b><code>%B</code></b> - Bytes sent, excluding HTTP headers</li>
<li><b><code>%D</code></b> - Time taken to process the request in microseconds</li>
<li><b><code>%D</code></b> - Time taken to process the request, in microseconds</li>
<li><b><code>%F</code></b> - Time taken to commit the response, in milliseconds</li>
<li><b><code>%h</code></b> - Remote host name (or IP address if
<code>enableLookups</code> for the connector is false)</li>
Expand Down