Log4J2 appender没有登录到ThreadContext文件夹

我有以下Log4J2配置XML:

      [%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X%m%n         

但是,只要log4j2 appender写入文件,它在写入指定的文件路径时就不会使用正确的${ctx:employeeId}字符串。

log4j2 appender第一次写入文件时,会写入${ctx:employeeId}指定的正确文件路径。 但是,每当有关具有另一个Id的员工的信息被放入线程上下文时,appender仍然会记录到旧文件路径。

例如,appender第一次记录它写入正确的路径:

 D:/example/logs/sites/1/2015-08-22/2/emp.log 

但是当记录器记录下一个雇员Id(使用新的ThreadContext)时,它仍然登录

 D:/example/logs/sites/1/2015-08-22/2/emp.log 

而不是例如:

 D:/example/logs/sites/1/2015-08-22/3/emp.log 

(注意员工ID不同。)

在日志输出模式中,我记录当前employeeId [$${ctx:employeeId}] ,以及当前线程上下文%X 。 输出显示正在使用正确的employeeId并且在ThreadContext中,但是appender没有记录到${ctx:employeeId}文件路径。

有谁知道我错过了什么吗? 或者如果我做错了什么? 或者这可能是Log4j2的错误? 谢谢你的帮助!

好吧,我知道这个答案在问题提出后很久就会出现,但如果这可能仍然对你或其他人有所帮助,我将分享我发现的内容。

首先,我无法重现问题,但我确实有代码可以实现你想要的,所以我将分享我的代码,希望通过查看它你可以确定你出错的地方。 如果没有,请提供最小,完整和可validation的示例,以便任何试图帮助您的人都可以重现该问题。

这是我的工作代码:

 package pkg; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import org.apache.logging.log4j.ThreadContext; public class Log4j2DiffFilePerCtxVarMain { private static final Marker TELEMETRIC = MarkerManager.getMarker("TELEMETRIC"); public static void main(String[] args){ Logger log = LogManager.getLogger(); ThreadContext.put("workId", "mainWorkId"); ThreadContext.put("employeeId", "mainEmployeeId"); log.info(TELEMETRIC, "Hey here's some info log from main!"); Thread t1 = new Thread(new Runnable(){ public void run(){ Logger log = LogManager.getLogger(); ThreadContext.put("workId", "thread1WorkId"); ThreadContext.put("employeeId", "thread1EmployeeId"); log.info(TELEMETRIC, "Hey here's some info log from thread1!"); } }); t1.start(); } } 

这是log4j2.xml:

          [%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X %m%n                

当我使用此log4j2.xml运行此代码时,我看到以下结果:

在此处输入图像描述

第一个日志包含:

 [2017-04-13T20:42:49,814][INFO ][p.Log4j2DiffFilePerCtxVarMain][TELEMETRIC][mainEmployeeId] {employeeId=mainEmployeeId, workId=mainWorkId} Hey here's some info log from main! 

第二个日志包含:

 [2017-04-13T20:42:49,822][INFO ][p.Log4j2DiffFilePerCtxVarMain$1][TELEMETRIC][thread1EmployeeId] {employeeId=thread1EmployeeId, workId=thread1WorkId} Hey here's some info log from thread1! 

希望这可以帮助!