日志对与一个系统来说非常重要,当系统出现了问题的时候,我们可以根据日志来排查问题所在,但是在排查日志的时候,很多日志都混合在一起,不知道哪些是一次请求的,给排查带来了不小的麻烦,今天分享一个把一次请求的日志串联起来的方法,抛砖引玉,如果大家还有更好的,欢迎留言。
主要原理:利用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学习视频