日志跟踪
- 在每条日志前添加一个随机字符串并且确保同一个请求的字符串相同。如下:
c6019df137174d2b98631474db4156b7
为此次请求的标识。通过次标识可以查询到所有该请求的日志信息
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:209]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:214]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:223]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2020-08-11 19:56:58:224]-[http-nio-8803-exec-4]-
- 同时可以将此标识返回给前端,便于问题查询。
traceID: c6019df137174d2b98631474db4156b7
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://test.page.qingin.cn
Cache-Control: max-age=30
Connection: keep-alive
Content-Type: application/json;charset=UTF-8
Date: Tue, 11 Aug 2020 12:02:19 GMT
Expires: Tue, 11 Aug 2020 12:02:49 GMT
Server: nginx/1.16.1
traceID: c6019df137174d2b98631474db4156b7
Transfer-Encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
我们可以通过过滤器实现以上的功能
package com.generator.admin.filter;
import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
@WebFilter(filterName = "Log4j2Filter", urlPatterns = "/*", initParams = {
@WebInitParam(name = "DESCRIPTION", value = "这是Log4j2Filter过滤器")})
public class Log4j2Filter implements Filter {
private String description;
public static final String TRACE_ID = "traceID";
private static final Logger logger = LoggerFactory.getLogger(Log4j2Filter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
description = filterConfig.getInitParameter("DESCRIPTION");
System.out.println("过滤器初始化:"+ description);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException,ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String traceId = UUID.randomUUID().toString().replace("-", "");
// 随机数放到此线程的上下文中,可以在每条日志前加入。具体看下面log4j2.xml
ThreadContext.put(TRACE_ID, traceId);
// 随机数放到Header中,在Response Headers中可查看到此数据
resp.addHeader(TRACE_ID, traceId);
filterChain.doFilter(req, resp);
ThreadContext.clearAll();
}
@Override
public void destroy() {
System.out.println("过滤器,被销毁:"+ description);
}
}
- log4j2.xml
<PatternLayout pattern="[traceID:%X{traceID}]-[%d{yyyy-MM-dd HH:mm:ss:SSS}]-[%t]-[%p]-[%l]-%m%n"/>
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" monitorInterval="30">
<Properties>
<Property name="logPath">logs</Property>
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[traceID:%X{traceID}]-[%d{yyyy-MM-dd HH:mm:ss:SSS}]-[%t]-[%p]-[%l]-%m%n"/>
</console>
</appenders>
<loggers>
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<logger name="com.zaxxer" level="WARN"></logger>
<logger name="com.generator" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
最后