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!
希望这可以帮助!