介绍
有时我们需要在Tomcat中记录使用情况活动。可能是tomcat是该站点的主要Web服务器,我们想要记录站点活动(点击,页面浏览,错误)。可能是tomcat是应用程序服务器,我们想查看是否有任何测试系统投入生产,或者希望将资源请求与异常相关联。此HowTo旨在说明在tomcat中设置访问日志所需的步骤。在撰写本文时,tomcat 6仍是主流版本,因此本文档将使用tomcat 6作为示例,但我不希望有太多差异无法应用于tomcat 5.5或tomcat 7。
启用Tomcat访问记录器
通过修改server.xml文件并取消对“访问日志值”的注释,可以启用Tomcat访问日志记录。在默认的tomcat实现中,访问日志值部分位于Host元素内。取消注释该条目将启用一个访问日志,其中包含与Apache中“公共”日志文件格式等效的字段。值门的默认设置将导致文件名为“ localhost_access_log”,后跟日期,后跟“ .txt”文件扩展名。IP地址将被记录,而不是主机名和日志文件将被写入${tomcat.home}/logs目录。日志文件中使用通用格式显示的字段为:
客户端主机名(如果默认resolveHosts值未更改为“ true”,则记录为IP )。
远程逻辑用户名(始终显示“-”)。
远程认证的用户标识(如果存在)
要求的日期和时间
请求的HTTP方法和URI
HTTP响应状态代码
响应的大小(以字节为单位)(不包括http响应头)
以下是server.xml相关部分的摘要,显示了新启用的访问日志记录默认值:
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
<!– SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
–>
<!– Access log processes all example.
Documentation at: /docs/config/valve.html –>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt” pattern=”common” resolveHosts=”false”/>
</Host>
自定义访问日志
通用日志格式是可以的,但是可以更改模式以combined添加User-Agent(浏览器或机器人类型)以及引荐网站和URI。Tomcat还提供了其他选项来记录诸如请求协议,接收到请求的本地端口,用户会话ID,传入或传出的请求标头等之类的内容。完整的列表记录在Tomcat配置参考值组件页面中。
如果您运行的tomcat版本大于6.0.21或tomcat 7,则可以利用新的远程IP Valve。对于访问日志记录,此值门的好处是,如果在X-Forwarded-For标头中传递了IP地址,它将自动将客户端IP与通过X-Forwarded-For标头传递的IP地址交换。加载非常简单。只需org.apache.catalina.valves.RemoteIpValve在AccessLogValve声明之前将添加到您的server.xml中即可。例如:
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
<!– SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
–>
<!– Remote IP Valve –>
<Valve className=”org.apache.catalina.valves.RemoteIpValve” />
<!– Access log processes all example.
Documentation at: /docs/config/valve.html –>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt”
pattern=”combined” resolveHosts=”false”/>
–>
</Host>
这足以使您开始使用RemoteIP Valve,但是您将需要添加一些其他设置来对其进行自定义,使其特定于您的环境。例如,如果您的服务器有一些F5 BigIP负载均衡,您将需要将SNAT IP的IP地址添加到RemoteIP Valve的internalProxies属性中。
如果您使用的tomcat 6版本早于6.0.21,并且您想存储X-Forwarded-For IP地址,则可以修改patternAccessLogValve的属性。您需要删除“ common”或“ combined”模式并将其替换为以下模式之一:
Common Log Format: %{X-Forwarded-For}i %l %u %t “%r” %s %b
Combined Log Format: %{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i %{Referer}i
RemoteIP Valve确实处理的主要问题是,您只会在日志中获得X-Forwarded-For地址。如果您直接命中应用服务器,而绕过在请求中插入X-Forwarded-For标头的设备,则不会记录IP地址。您仍然会记录一个请求-您只是不知道它来自哪里。