Enabling HTTP-Level Request/Response Logs
HTTP-level request/response logs help monitor your application's usage activities, such as who is accessing it, how many hits it receives, what the errors are etc. This information is useful for troubleshooting. As the runtime of WSO2 products is based on Apache Tomcat, you can use the Access_Log_Valve variable in Tomcat 7 as explained below to enable HTTP-level request/response logs in WSO2 products.
Follow the instructions below to enable HTTP level request/response logs:
Edit the
Access_Log_Valve
variable in the <PRODUCT_HOME>/repository/conf/tomcat/catalina-server.xml
file, using the following configuration:<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${carbon.home}/repository/logs" prefix="localhost_access_log_sample." suffix=".log" pattern="%{xxx}i %{xxx}o" resolveHosts="false"/>
The
pattern
parameter is used to specify the parts of the request/response that needs to be logged.xxx -
stands for the header name we need to log%{xxx}i -
stands for the request headers%{xxx}o -
stands for the response headers
For more information on all possible values that can be given in the
pattern
parameter, go to:
http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Log_Valve
- Restart the server. This will create a log file named
localhost_access_log_sample.{DATE}.log
inside the <PRODUCT_HOME>/repository/logs
directory.
Sample configurations
Given below are a few sample configurations:
Example 1: Logging request headers
The configuration is as follows:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${carbon.home}/repository/logs" prefix="localhost_access_log_test." suffix=".log" pattern="%{Content-Type}i %{Accept}i %{Accept-Encoding}i" resolveHosts="false"/>
This sample configuration logs the Content-type, Accept and Accept-encoding headers of every request coming to the server. For example, in the following example, we use the RequestInfoExample
to send the HTTP request:
GET http://<IP>:<PORT>/example/servlets/servlet/RequestInfoExample?abc=xyz
It records the following log entry in the localhost_access_log_sample.{DATE}.log
file.
text/plain; charset=utf-8 */* gzip,deflate,sdch
Example 2: Logging response headers
The configuration is as follows:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${carbon.home}/repository/logs" prefix="localhost_access_log_test." suffix=".log" pattern="%{Content-Type}o %{Content-Length}o %{Date}o %{Server}o" resolveHosts="false"/>
The a bove configuration sample logs the Content-type
, Content-Length
, Date
and Server
headers of every response coming from the server as follows:
text/html;charset=ISO-8859-1 662 Tue, 09 Jul 2013 11:21:50 GMT WSO2 Carbon
Example 3: Logging other variable values
The configuration is as follows:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="${carbon.home}/repository/logs" prefix="localhost_access_log_test." suffix=".log" pattern="%r %q %h" resolveHosts="false"/>
The above sample configuration logs the first line of the request (method and request URI), query string (prepended with a '?' if it exists) and remote hostname (or IP) of every request coming to the server as follows.
“GET /example/servlets/servlet/RequestInfoExample?abc=xyz HTTP/1.1” ?abc=xyz 10.100.0.67
Example 4: Logging URL encoded parameters
You cannot use the AccessLogValve
to log URL encoded parameters. However, you can use the ExtendedAccessLogValve
attribute for this purpose. In this example only two values (namely, className
and pattern
) are modified from the previous configuration.
The configuration is as follows:
<Valve className="org.apache.catalina.valves.ExtendedAccessLogValve" directory="${carbon.home}/repository/logs" prefix="localhost_access_log_extended." suffix=".log" pattern="x-P(param1) x-P(param2)" resolveHosts="false"/>
Send the POST request together with the URL encoded values such as param1
=value1
and param2
=value2
as follows:
POST http://<IP>:<PORT>/example/servlets/servlet/RequestInfoExample
The above sample configuration logs the following:
'value1' 'value2'