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实现

  1. 修改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 值

log4j 中“ThreadContext”的替代方案

log4j2 isThreadContextMapInheritable 属性用法

日志框架之log4j2的使用

一问三不知之log4j2漏洞简析