日志Id生成追踪方案
背景
新接手的项目是一个老项目。
最可怕的是当时开发的人非常有个性:
- 一个Map传一天
- 不喜欢打印日志
- 也不写注释
我。。。
可是我也是混个饭吃。
线上出了问题,总会反馈我这里,定位日志问题,眼睛贼累,于是就搞了一个这个东西。
为的就是定位一个完整请求方便,更多是为了,通过日志了解下前任的业务思路。
目标
早点下班吃饭!
开发配置
创建创建唯一日志ID过滤器,注册服务
public class Log4jMDCFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) req;
//jk-web层直接生成
//jk-service层,从request参数中获取tranceLog参数,使用jk-web生成的日志ID/没有就自动生成
MDC.put("tranceLog", TraceLogUtil.getLogStr);
HttpSession session = request.getSession();
//插入一条系统日志
chain.doFilter(request, resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
MDC.clear();//防止内存溢出。要实时清空
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
注册服务
在类WebConfig.class中注册服务
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
CharsetFilter charsetFilter = new CharsetFilter();
registrationBean.setFilter(charsetFilter);
registrationBean.setFilter(log4jMDCFilter);
List<String> urlPatterns = new ArrayList<String>();
urlPatterns.add("/*");
registrationBean.setUrlPatterns(urlPatterns);
return registrationBean;
}
logback配置,优化打印日志
<property name="PATTERN" value="%yellow(%-12(%d{HH:mm:ss.SSS})) |-%highlight(%-5level) [%thread] %X{tranctLog} %cyan(%logger{16} [%L]) -| %msg%n"/>
打印示例
蓝色为日志ID打印
红色为缩写类路径
10:49:32.008 |-INFO [main] 58d00fb7-7322-4c5b-08d8-edf7231b7398 c.j.c.o.OkHttpUtil [179] -| 请求失败----------------url:http://127.0.0.1:8766/merchant/queryCurrentBuyService,参数:{merchantId=100081, tranctLog=58d00fb7-7322-4c5b-08d8-edf7231b7398}
10:49:32.011 |-ERROR [main] 58d00fb7-7322-4c5b-08d8-edf7231b7398 c.j.c.o.OkHttpUtil [180] -| 请求失败----------------
请求下层服务携带日志Id
jk-web传递到jk-service层的时候
强烈建议使用post时候,参数使用该方法生成请求Map
Map request = RequestUtil.creatBaseRequestMap(MDC.get("tranctLog"));