gpt4 book ai didi

java - 如何配置 Log4j(1 或 2)以在针对 Slf4j 进行编码时使用自定义日志文件名

转载 作者:行者123 更新时间:2023-12-01 11:26:23 25 4
gpt4 key购买 nike

我知道有很多与此相关的问题,但我找不到与我正在查看的场景相匹配的问题,所以这就是问题。

当前日志记录设置:使用带有 Log4j 1.2 绑定(bind)的 Slf4j 编码的记录器。使用了 DailyRollingAppender

程序:一个多线程后端Java程序处理表中的数据并调用相关的Web服务。

收到一个新请求,要求日志文件名基于特定数据,我们将其称为match_code。这样,每当线程正在处理 MatchA 时,线程使用的日志文件应设置为 MatchA.log

我在谷歌上搜索了一段时间,了解到每当进程启动时我都需要以编程方式配置 Log4j 配置,问题是我应该如何更改日志文件名设置,同时不影响其他设置,例如 模式

如果这意味着可以解决我的问题,我愿意切换到 Log4j 2.x,但到目前为止还没有找到相关示例。

如有任何建议,我们将不胜感激。谢谢。

更新已尝试的内容

尝试使用System.setProperty方式动态设置日志文件。这是属性设置:

log4j.appender.file.File=/log/${logfile.name}.log

在主类中,在其他内容之前添加这两行:

    static{
System.setProperty("logfile.name","output");
}

private static Logger logger = LoggerFactory.getLogger(Engine.class);

在进程发现要处理的数据后立即添加此内容:

System.setProperty("logfile.name",match_code+"_output");

其中 match_code 是数据库中的值,例如“MatchA”

结果是,主类确实有名为output.log的日志。但是,如果我输入数据进行测试,日志仍将转到 output.log 并且不会根据数据创建新的日志文件。

最佳答案

不知道我是否理解您的问题:您希望根据您正在处理的数据将相同的日志消息发送到不同的日志文件?

如果你使用LogBack,可以通过MDC + SiftingAppender的组合来完成。例如,在您的代码中,您可以执行以下操作:

(在代码中)

MDC.put("match_code", "MatchA");
logger.debug("whatever message"); // just log it normally

(在 logback.xml 中)

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>match_code</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${match_code}" class="ch.qos.logback.core.FileAppender">
<file>${match_code}.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
</layout>
</appender>
</sift>
</appender>

请注意,这里我使用 LogBack 作为日志后端。 Log4j 1 没有官方的筛选附加器。我记得 Log4j 2 中有类似的东西。如果你真的坚持使用 Log4j,希望这可以作为你搜索的起点

关于java - 如何配置 Log4j(1 或 2)以在针对 Slf4j 进行编码时使用自定义日志文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30771877/

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