Java Log4J2 appender未记录到ThreadContext文件夹
我有以下Log4J2配置XML:Java Log4J2 appender未记录到ThreadContext文件夹,java,log4j,log4j2,Java,Log4j,Log4j2,我有以下Log4J2配置XML: <Routing name="myAppender"> <Routes pattern="$${ctx:workId}"> <Route> <File fileName="${my-path}/sites/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log" name="myAppender-${ctx:wo
<Routing name="myAppender">
<Routes pattern="$${ctx:workId}">
<Route>
<File fileName="${my-path}/sites/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log" name="myAppender-${ctx:workId}">
<MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X%m%n</Pattern>
</PatternLayout>
</File>
</Route>
</Routes>
</Routing>
<Async name="Async">
<AppenderRef ref="myAppender" level="info"/>
</Async>
但当记录器记录下一个员工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的一个bug?谢谢你的帮助 好吧,我意识到这个答案是在问题被问了很久之后才给出的,但如果这仍然对你或其他人有帮助,我将分享我的发现 首先,我不能重现这个问题,但我有代码可以实现您想要的,所以我将分享我的代码,希望通过查看它,您可以确定哪里出了问题。如果没有,请提供一份报告,以便任何试图帮助您的人都可以重现该问题 这是我的工作代码:
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文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Routing name="myAppender">
<Routes pattern="$${ctx:workId}">
<Route>
<File
fileName="logs/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log"
name="myAppender-${ctx:workId}">
<MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout>
<Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X %m%n</Pattern>
</PatternLayout>
</File>
</Route>
</Routes>
</Routing>
<Async name="Async">
<AppenderRef ref="myAppender" level="info" />
</Async>
</Appenders>
<Loggers>
<Root level="trace">
<appender-ref ref="Async" />
</Root>
</Loggers>
</Configuration>
第二个日志包含以下内容:
[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!
希望这有帮助 谢谢兄弟。这个解决方案有帮助
[2017-04-13T20:42:49,822][INFO ][p.Log4j2DiffFilePerCtxVarMain$1][TELEMETRIC][thread1EmployeeId] {employeeId=thread1EmployeeId, workId=thread1WorkId} Hey here's some info log from thread1!