日志对与一个系统来说非常重要,当系统出现了问题的时候,我们可以根据日志来排查问题所在,但是在排查日志的时候,很多日志都混合在一起,不知道哪些是一次请求的,给排查带来了不小的麻烦,今天分享一个把一次请求的日志串联起来的方法,抛砖引玉,如果大家还有更好的,欢迎留言。
主要原理:利用slf4j的MDC 以及 jfinal handler
代码
package com.future.common.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import com.jfinal.handler.Handler;
import com.jfinal.kit.StrKit;
public class RequestIdHandler extends Handler {
private static final String REQUESTID = "REQUESTID";
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
String requestId = request.getHeader(REQUESTID);
if(StrKit.isBlank(requestId)){
requestId = StrKit.getRandomUUID();
}
MDC.put(REQUESTID, requestId);
next.handle(target, request, response, isHandled);
}
}MDC是slf4j提供的一个工具,我们把每次请求的REQUESTID放到MDC中,在日志配置文件中 %X{REQUESTID} 就能获取到REQUESTID
log4j.appender.LogFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LogFile.File = ./future_log/future_log.log
log4j.appender.LogFile.Append = true
log4j.appender.LogFile.BufferSize = 8192
log4j.appender.LogFile.BufferedIO = false
log4j.appender.LogFile.ImmediateFlush = true
log4j.appender.LogFile.DatePattern='.'yyyy-MM-dd
log4j.appender.LogFile.Threshold = DEBUG
log4j.appender.LogFile.layout = org.apache.log4j.PatternLayout
log4j.appender.LogFile.layout.ConversionPattern ==%X{REQUESTID}|%d{yyyy-MM-dd HH:mm:ss,SSS} %p %l -%m%n这样每次根据REQUESTID就能知道哪些日志是一次请求的了。
关注我的公众号,免费获取Java + Jfinal学习视频
