Log4j2之ThreadContext
Posted 养码青年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j2之ThreadContext相关的知识,希望对你有一定的参考价值。
简介
系统中使用log4j2作为日志系统,然而在高并发的情况下,多次请求的日志参杂在一起,要跟踪某个用户一次的请求操作所有日志是很麻烦的。幸运的是log4j中有相应的解决方案。
NDC和MDC
NDC和MDC的原理是用了java的ThreadLocal类。可以针对不同线程存储信息。但是今天在log4j2上使用时发现没有找到NDC和MDC。查找官方文档,原来是换成了ThreadContext。操作也挺简单:
X占位符
在官方文档的Pattern Layout章节的Patterns子章节下,可以看到对于%X占位符的描述。
描述中提到,存入ThreadContext的映射关系,能够输出到对应的X占位符中,这正好是显示登录者信息的理想实现方式。
Demo实现
修改log4j2配置文件的
PatternLayout.pattern
格式,追加[%X{userName}]
占位符
<PatternLayout pattern="%d %-5p [%t][%X{userName}] %C{2} (%F:%L) - %m%n"/>
2.追加Java代码,登录时,往ThreadContext存入映射关系,这里为了方便演示,存了固定值
ThreadContext.put("userName","kevin");
3.追加Java代码,在退出登录后,清除ThreadContext的映射关系
ThreadContext.clear();
至此,实现完毕。
效果
2019-10-31 10:01:37,932 INFO [http-nio-8082-exec-4][kevin] aspect.LogAspect (WareLogAspect.java:56)
参考:
-https://www.wangzhengzhen.com
-https://spldeolin.com/posts/log4j2-mdc/?tdsourcetag=s_pctim_aiomsg
以上是关于Log4j2之ThreadContext的主要内容,如果未能解决你的问题,请参考以下文章
在 log4j2 中从 ThreadContext 设置和获取值
即使在使用 Vert.x 和 Log4j2 将“isThreadContextMapInheritable”设置为 true 后也没有获取 ThreadContext 值