tomcat的日志分为两部分
一是运行的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息
二是访问日志信息,他是记录的访问的时间,ip,url,sessionId等信息。主要介绍tomcat访问日志的开启和优化记录内容
1.tomcat产生的访问日志【localhost_access_log.Y-M-D.txt】
它记录的访问的时间,IP,访问的资料等相关信息
2. 首先是配置tomcat访问日志数据,配置的方式如下
打开${catalina}/conf/server.xml文件 — 注:${catalina}是tomcat的安装目录,打开下面注释,重启tomcat即可记录访问日志
3.记录访问日志的时间的具体参数
tomcat访问日志格式配置,在config/server.xml里Host标签下加上,以下是我配置的日志格式
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".log"
pattern="%h %l %u %t "%r" [%{postdata}r] %s %{Referer}i %{User-Agent}i %T %b" />
具体配置截图如下
日志格式如下,红框中为访问时间
4.查询访问最耗时的接口
这就要用到万能的awk了 我们的日志倒数第二列显示的访问时间。
cat localhost_access_log.2021-01-23.log | awk ‘{print $(NF-1)” “$0}’ | sort -n -r| awk ‘{$1=””;print $0}’ 按照倒数第二列由大到小显示接口以及访问时间。
这样我们就能找出那些借口耗时较大,然后对其进行优化,提高用户体验。
访问时间排序如下
如果想自己定义书写的文件的格式可以对上面的pattern里面的内容进行修改,可以修改的参数有以下数据
具体的日志产生样式说明如下(从官方文档中摘录):
%a – 远端IP地址
%A – 本地IP地址
%b – 发送的字节数,不包括HTTP头,如果为0,使用”-”
%B – 发送的字节数,不包括HTTP头
%h – 远端主机名(如果resolveHost=false,远端的IP地址)
%H – 请求协议
%l – 从identd返回的远端逻辑用户名(总是返回 ‘-‘)
%m – 请求的方法(GET,POST,等)
%p – 收到请求的本地端口号
%q – 查询字符串(如果存在,以 ‘?’开始)
%r – 请求的第一行,包含了请求的方法和URI
%s – 响应的状态码
%S – 用户的session ID
%t – 日志和时间,使用通常的Log格式
%u – 认证以后的远端用户(如果存在的话,否则为’-‘)
%U – 请求的URI路径
%v – 本地服务器的名称
%D – 处理请求的时间,以毫秒为单位
%T – 处理请求的时间,以秒为单位
另外还可以将cookie, 客户端请求中带的HTTP头(incoming header), 会话(session)或是ServletRequest中的数据都写到Tomcat的访问日志中,你可以用下面的语法来引用。
%{xxx}i – 记录客户端请求中带的HTTP头xxx(incoming headers)
%{xxx}c – 记录特定的cookie xxx
%{xxx}r – 记录ServletRequest中的xxx属性(attribute)
%{xxx}s – 记录HttpSession中的xxx属性(attribute)
5.记录Post请求参数使用postdata过滤器
package com.xiaoxiliu
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class PostDataDumperFilter implements Filter {
Logger logger = LoggerFactory.getLogger(getClass());
private FilterConfig filterConfig = null;
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (filterConfig == null)
return;
Enumeration<String> names = request.getParameterNames();
StringBuilder output = new StringBuilder();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
output.append(name).append("=");
String values[] = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (i > 0) {
output.append("' ");
}
output.append(values[i]);
}
if (names.hasMoreElements())
output.append("&");
}
request.setAttribute("postdata", output);
logger.debug("postdata: " + output);
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
在web.xml中添加配置该filter
<filter>
<filter-name>post-data-dumper-filter</filter-name>
<filter-class>com.xiaoxiliu.PostDataDumperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>post-data-dumper-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>