gpt4 book ai didi

java - Log4J2 appender 没有记录到 ThreadContext 文件夹

转载 作者:行者123 更新时间:2023-11-30 10:58:39 28 4
gpt4 key购买 nike

我有以下 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: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>

但是,每当 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 中,但附加程序未记录到该 ${ctx:employeeId} 文件路径。

有谁知道我是否遗漏了什么?或者如果我做错了什么?或者这可能是 Log4j2 的错误?感谢您的帮助!

最佳答案

好吧,我知道这个答案是在问题被提出很久之后才出现的,但如果这仍然对您或其他人有帮助,我会分享我的发现。

首先,我无法重现问题,但我确实有实现您想要的代码,所以我将分享我的代码,希望通过查看它您可以确定哪里出错了.如果不是,请提供 Minimal, Complete, and Verifiable Example这样任何试图帮助您的人都可以重现该问题。

这是我的工作代码:

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>

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

enter image description here

第一个日志包含这个:

[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!

希望这对您有所帮助!

关于java - Log4J2 appender 没有记录到 ThreadContext 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32158882/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com