diff --git a/java/org/apache/catalina/valves/AbstractAccessLogValve.java b/java/org/apache/catalina/valves/AbstractAccessLogValve.java index 31ed2c15e024..879da82d5d49 100644 --- a/java/org/apache/catalina/valves/AbstractAccessLogValve.java +++ b/java/org/apache/catalina/valves/AbstractAccessLogValve.java @@ -1545,17 +1545,26 @@ public CookieElement(String cookieNameToLog) { @Override public void addElement(CharArrayWriter buf, Date date, Request request, Response response, long time) { - String value = "-"; + StringBuilder value = new StringBuilder(); + boolean first = true; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookieNameToLog.equals(cookie.getName())) { - value = cookie.getValue(); - break; + if (first) { + first = false; + } else { + value.append(','); + } + value.append(cookie.getValue()); } } } - escapeAndAppend(value, buf); + if (value.length() == 0) { + buf.append('-'); + } else { + escapeAndAppend(value.toString(), buf); + } } } diff --git a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java index d717bac90350..852a473c430a 100644 --- a/java/org/apache/catalina/valves/ExtendedAccessLogValve.java +++ b/java/org/apache/catalina/valves/ExtendedAccessLogValve.java @@ -64,7 +64,7 @@ *
  • time-taken: Time (in seconds) taken to serve the request
  • *
  • x-threadname: Current request thread name (can compare later with stacktraces)
  • *
  • x-A(XXX): Pull XXX attribute from the servlet context
  • - *
  • x-C(XXX): Pull the first cookie of the name XXX
  • + *
  • x-C(XXX): Pull the cookie(s) of the name XXX
  • *
  • x-O(XXX): Pull the all response header values XXX
  • *
  • x-R(XXX): Pull XXX attribute from the servlet request
  • *
  • x-S(XXX): Pull XXX attribute from the session
  • @@ -298,12 +298,24 @@ public CookieElement(String name) { @Override public void addElement(CharArrayWriter buf, Date date, Request request, Response response, long time) { + StringBuilder value = new StringBuilder(); + boolean first = true; Cookie[] c = request.getCookies(); for (int i = 0; c != null && i < c.length; i++) { if (name.equals(c[i].getName())) { - buf.append(wrap(c[i].getValue())); + if (first) { + first = false; + } else { + value.append(','); + } + value.append(c[i].getValue()); } } + if (value.length() == 0 ) { + buf.append('-'); + } else { + buf.append(wrap(value.toString())); + } } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index d669f9be4b74..eeb630ad34aa 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -128,6 +128,12 @@ MemoryUserDatabase.save(). Deprecate and discontinue use of MemoryUser, MemoryRole, and MemoryGroup classes. (schultz) + + 66183: When logging cookie values in an access log valve and + there are multiple cookies with the same name, log all cookie values + rather than just the first. Based on pull request 541 by Han + Li. (markt) + 66184: Ensure that JULI root loggers have a default level of INFO. Pull request 533 provided by Piotr P. diff --git a/webapps/docs/config/valve.xml b/webapps/docs/config/valve.xml index 2969255be02e..75c2a36288bf 100644 --- a/webapps/docs/config/valve.xml +++ b/webapps/docs/config/valve.xml @@ -331,7 +331,7 @@ connection peer address (xxx=peer)
  • %{xxx}i write value of incoming header with name xxx (escaped if required)
  • %{xxx}o write value of outgoing header with name xxx (escaped if required)
  • -
  • %{xxx}c write value of cookie with name xxx (escaped if required)
  • +
  • %{xxx}c write value of cookie(s) with name xxx (comma separated and escaped if required)
  • %{xxx}r write value of ServletRequest attribute with name xxx (escaped if required)
  • %{xxx}s write value of HttpSession attribute with name xxx (escaped if required)
  • %{xxx}p write local (server) port (xxx==local) or @@ -493,7 +493,7 @@
  • cs(XXX) for incoming request headers with name XXX
  • sc(XXX) for outgoing response headers with name XXX
  • x-A(XXX) for the servlet context attribute with name XXX
  • -
  • x-C(XXX) for the first cookie with name XXX
  • +
  • x-C(XXX) for the cookie(s) with name XXX (comma separated if required)
  • x-O(XXX) for a concatenation of all outgoing response headers with name XXX
  • x-P(XXX) for the URL encoded (using UTF-8) request parameter with name XXX
  • x-R(XXX) for the request attribute with name XXX