如何配置 Log4j(1 或 2)以在针对 Slf4j 编码时使用自定义日志文件名
How to configure Log4j (1 or 2) to use custom log file name while code against Slf4j
我知道有很多与此相关的问题,但我找不到与我正在查看的场景相匹配的问题,所以这就是问题。
当前的日志记录设置:使用 Slf4j 和 Log4j 1.2 绑定编码的记录器。 DailyRollingAppender
使用过。
该程序:一个多线程后端 Java 程序处理来自 table 的数据并调用相关的网络服务。
一个新请求要求日志文件名基于某个数据,我们称之为 match_code
。有了这个,每当一个线程正在处理说MatchA
,那么线程使用的日志文件应该设置为MatchA.log
我在谷歌上搜索了一段时间,了解到我需要在进程启动时以编程方式配置 Log4j 配置,问题是我应该如何更改日志文件名设置,同时不影响其他设置,例如 Patterns
。
我愿意切换到 Log4j 2.x 如果这意味着可以解决我的问题,到目前为止还没有找到这方面的样本。
如有任何建议,我们将不胜感激。谢谢。
更新尝试过的内容
尝试使用System.setProperty
方式动态设置日志文件。这是属性设置:
log4j.appender.file.File=/log/${logfile.name}.log
在主 class 中,在其他任何内容之前添加了这两行:
static{
System.setProperty("logfile.name","output");
}
private static Logger logger = LoggerFactory.getLogger(Engine.class);
在进程发现要处理的数据后立即添加:
System.setProperty("logfile.name",match_code+"_output");
其中 match_code
是来自数据库的值,例如 'MatchA'
结果是,主要 class DID 将日志命名为 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 没有官方的 sifting appender。我有点记得 Log4j 2 中有类似的东西。如果你真的坚持使用 Log4j,希望这可以作为你搜索的起点
我知道有很多与此相关的问题,但我找不到与我正在查看的场景相匹配的问题,所以这就是问题。
当前的日志记录设置:使用 Slf4j 和 Log4j 1.2 绑定编码的记录器。 DailyRollingAppender
使用过。
该程序:一个多线程后端 Java 程序处理来自 table 的数据并调用相关的网络服务。
一个新请求要求日志文件名基于某个数据,我们称之为 match_code
。有了这个,每当一个线程正在处理说MatchA
,那么线程使用的日志文件应该设置为MatchA.log
我在谷歌上搜索了一段时间,了解到我需要在进程启动时以编程方式配置 Log4j 配置,问题是我应该如何更改日志文件名设置,同时不影响其他设置,例如 Patterns
。
我愿意切换到 Log4j 2.x 如果这意味着可以解决我的问题,到目前为止还没有找到这方面的样本。
如有任何建议,我们将不胜感激。谢谢。
更新尝试过的内容
尝试使用System.setProperty
方式动态设置日志文件。这是属性设置:
log4j.appender.file.File=/log/${logfile.name}.log
在主 class 中,在其他任何内容之前添加了这两行:
static{
System.setProperty("logfile.name","output");
}
private static Logger logger = LoggerFactory.getLogger(Engine.class);
在进程发现要处理的数据后立即添加:
System.setProperty("logfile.name",match_code+"_output");
其中 match_code
是来自数据库的值,例如 'MatchA'
结果是,主要 class DID 将日志命名为 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 没有官方的 sifting appender。我有点记得 Log4j 2 中有类似的东西。如果你真的坚持使用 Log4j,希望这可以作为你搜索的起点