您可以使用 Logback 的 SiftingAppender 将日志定向到特定的日志文件。
这是一个例子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="SIFTER" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>testName</key>
<defaultValue>ALL</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${testName}" class="ch.qos.logback.core.FileAppender">
<file>target/logs/Log_Test_${testName}.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
</sift>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="SIFTER"/>
</root>
</configuration>
使用此 Logback 配置,以下代码...
String[] testNames = new String[] { "one", "two"};
for (String testName : testNames) {
MDC.put("testName", testName);
logger.info("This message should go into the log file for {}", testName);
}
... 将导致填充 两个 日志文件:
~/dev/code/stackoverflow/target/logs$ cat Log_Test_one.log
09:04:19.922 [main] INFO SomeClassTest - This message should go into the log file for one
~/dev/code/stackoverflow/target/logs$ cat Log_Test_two.log
09:04:19.938 [main] INFO SomeClassTest - This message should go into the log file for two
还有下面的代码……
String[] testNames = new String[] { "one", "two"};
for (String testName : testNames) {
logger.info("This message should go into the log file for {}", testName);
}
... 将导致 一个 日志文件被填充:
~/dev/code/stackoverflow/target/logs$ cat Log_Test_ALL.log
09:06:54.009 [main] INFO SomeClassTest - This message should go into the log file for one
09:06:54.022 [main] INFO SomeClassTest - This message should go into the log file for two
因此,如果您在调用 logger.xxx() 之前填充 testName MDC 属性,那么日志事件将被筛选,即定向到以该 MDC 值命名的日志文件。如果您不填充 testName MDC 属性,则所有日志事件都将被定向到“ALL”日志文件。
更新 1 回应此评论:
好吧,我用你提供的那个替换了我原来的 File Appender 的整个块,但它根本没有生成日志文件..出了点问题。
如果不查看您的所有配置,很难诊断出问题所在,因此我已更新此答案以包含完整的logback.xml,并且此配置已启用调试,因此您应该会看到类似...的输出...
09:59:32,268 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [SIFTER]
09:59:32,281 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.sift.MDCBasedDiscriminator] for [discriminator] property
09:59:32,298 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
09:59:32,298 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
09:59:32,304 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [SIFTER] to Logger[ROOT]
...
09:59:34,725 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
09:59:34,730 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-one]
...
09:59:34,732 |-INFO in ch.qos.logback.core.FileAppender[FILE-one] - File property is set to [target/logs/Log_Test_one.log]
... 显示正在运行的筛选附加程序。