tomcat中的日志
tomcat家目录/logs下的日志文件:
catalina.out
tomcat所有的 启动日志+程序的日志。
catalina.xxxx-xx-xx.log
tomcat当天的 启动日志+程序的日志。
localhost.xxxx-xx-xx.log
没有被捕获的异常(eg:容器启动时抛出的异常)会将异常信息输出到这里,常用于排查服务启动失败的问题。
localhost_access_log.xxxx-xx-xx.txt日志
tomcat当天的 访问记录
访问日志:localhost_access_log.xxxx-xx-xx.txt
文档:http://tomcat.apache.org/tomcat-8.0-doc/config/valve.html
tomcat访问日志格式配置,在config/server.xml里Host标签下加上:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" [%{postparam}r] %s %{Referer}i %{User-Agent}i %T %b" />
参数说明:
className Java class name of the implementation to use.This MUST be set to org.apache.catalina.valves.AccessLogValve to use the default access log valve.
directory 日志文件存放的目录。通常设置为tomcat下已有的那个logs文件。
prefix 日志文件的名称前缀。
suffix 日志文件的名称后缀。
resolveHosts 如果是true,tomcat会将这个服务器IP地址通过DNS转换为主机名;如果是false,就直接写服务器IP地址啦。默认false。
rotatable 默认为true,tomcat生成的文件名为prefix(前缀)+.+时间(一般是按天算)+.+suffix(后缀),如:localhost_access_log.2007-09-22txt。
设置为false的话,tomcat会忽略时间,不会生成新文件,文件名就是:localhost_access_log.txt。长此以往,这个日志文件会超级大
condition 这个参数不太实用,可设置任何值,比如设置成condition="tkq",那么只有当ServletRequest.getAttribute("tkq")为空的时候,该条日志才会被记录下来。
fileDateFormat 顾名思义,就是时间格式嘛。但这个时间格式是针对日志文件名起作用的。咱们生成的日志文件全名:localhost_access_log.2016-09-22.txt,这里面的2016-09-22就是这么来的。
如果想让tomcat每小时生成一个日志文件,也很简单,将这个值设置为:fileDateFormat="yyyy-MM-dd.HH"。
pattern 输出日志的格式,由下面的这些占位符来表示:
%a 记录访问者的IP
%A 记录本地服务器的IP
%b 发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
%B 发送信息的字节数,不包括http头。
%h 服务器的名称。如果resolveHosts为false的话,这里就是IP地址了
%H 访问者的协议
%I 当前请求线程名称
%l 官方解释:Remote logical username from identd (可能这样翻译:记录浏览者进行身份验证时提供的名字)(always returns '-')
%m 访问的方式,是GET还是POST
%p 本地接收访问的端口
%q 查询参数
%r First line of the request (method and request URI) 请求的方法和URL
%s http的响应状态码
%S 用户的session ID
%t 请求时间
%u 得到了验证的访问者,否则就是"-"
%U 访问的URL地址
%v 服务器名称
%D Time taken to process the request,in millis,请求消耗的时间,单位毫秒
%T Time taken to process the request,in seconds,请求消耗的时间,单位秒记
%{xxx}i 传入请求标头
%{xxx}o 用于传出响应标头
%{xxx}c 对于特定的请求cookie
%{xxx}s xxx是HttpSession中的一个属性
%{xxx}r xxx是ServletRequest中的一个属性。打印post方法的参数时,可以使用该占位符来实现:
举例:
/**
* 定义一个过滤器,doFilter()方法中在request中添加一个属性postparam,然后在server.xml的配置中使用%{postparam}r 就可以获取到post的参数了。
*/
public final class PostParamFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Enumeration<String> names = request.getParameterNames();
StringBuilder postparam = new StringBuilder();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
postparam.append(name).append("=");
String values[] = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (i > 0) {
postparam.append("' ");
}
postparam.append(values[i]);
}
if (names.hasMoreElements()) {
postparam.append("&");
}
}
request.setAttribute("postparam", postparam);
chain.doFilter(request, response);
}
}