Apache Tomcat valve logging
Apache Tomcat Valve logging helps to determine the following;
- Whether an HTTP request is received by the Apache Tomcat server that hosts the application.
- Header information.
You can enable the Apache Tomcat valve logging from the server.xml file located in the Tomcat\conf\ folder.
To enable Apache Tomcat valve logging
- Search for the following entry in the server.xml file located in the <tomcat_install>/conf/ folder.
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"> Check if the following Valve statement is available. Add the Valve statement if it is not available.
<Valve className="org.apache.catalina.valves.
FastCommonAccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".log" pattern="%h %t %u "%r" %s b:%b t:%D p:%F" resolveHosts="false" />Apache Tomcat version 7 or earlier
<Valve className="org.apache.catalina.valves.
FastCommonAccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".log" pattern="%h %t %u %{JSESSIONID}c "%r" %s b:%b t:%D p:%F" resolveHosts="false" />Apache Tomcat version 8 or later
<Valve className="org.apache.catalina.valves.
AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %t %u %{JSESSIONID}c "%r" %s b:%b t:%D p:%F " />This pattern captures the following details:
- Client IP
- Date and time of request
- User name
- JSESSIONID cookie sent with the request
- Request
- Status
- Bytes sent
- Total process time including transfer to browser in milliseconds
- Process time excluding transfer in milliseconds
- Restart the Apache Tomcat server.
Each HTTP request is now logged in the localhost_access*.log file located in the <tomcat_install>\logs\ folder.
Pattern details
The following table describes the pattern details:
Pattern | Description |
---|---|
%a | Remote IP address |
%A | Local IP address |
%b | Bytes sent, excluding HTTP headers, or '-' if zero |
%B | Bytes sent, excluding HTTP headers |
%h | Remote host name (or IP address if resolve Hosts is false) |
%H | Request protocol |
%l | Remote logical username from identd (always returns '-') |
%m | Request method (GET, POST) |
%p | Local port on which this request was received |
%q | Query string (appended with a '?' if it exists) |
%r | First line of the request (method and request URI) |
%s | HTTP status code of the response |
%S | User session ID |
%t | Date and time, in Common Log Format |
%u | Remote user that was authenticated (if any), else '-' |
%U | Requested URL path |
%v | Local server name |
%D | Time taken to process the request and transfer results to browser, in milliseconds |
%F | Time taken to process the request, in milliseconds |
%T | Time taken to process the request, in seconds |
%I | Current request thread name (can compare later with stack traces) |
%{xxx}i | write value of incoming header with name xxx ex: %{Cookie}i will get you all the cookies sent |
%{xxx}o | write value of outgoing header with name xxx |
%{xxx}c | write value of cookie with name xxx ex: %{JSESSIONID}c |
Examples
The following example illustrates the Valve statement to check Accept-Encoding headers.
The following example illustrates the Valve statement to track the JSESSIONID cookie submitted with each request
directory="logs" prefix="localhost_access_log" suffix=".txt"
pattern="%h %t %u %{JSESSIONID}c "%r" %s " />
Related topic