如何把一次请求所有的日志串联起来

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

主要原理:利用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学习视频

image.png


评论区

JFinal

2018-12-26 11:30

这个玩法很新颖,对于日志量大的项目很有用,赞

快乐的蹦豆子

2018-12-26 19:53

结合splunk专业管理日志的工具,很容易就能排查出问题,节省很多时间

热门分享

扫码入社