在本教程中,我们将向您展示如何使用回溯Mapped Diagnostic Context (MDC)
和SiftingAppender
为每个线程创建一个单独的日志文件。
经Logback 1.1.2测试的PS,应在较早版本中工作。
注意
有关更多信息,请参阅此Logback MDC文档
1. logback.xml示例
一个logback.xml
文件,向您展示如何声明和配置SiftingAppender
和MDC
。
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="USER_HOME" value="C:\\logs\\analyzer" />
<appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
<!-- This is MDC value -->
<!-- We will assign a value to 'logFileName' via Java code -->
<discriminator>
<key>logFileName</key>
<defaultValue>head0</defaultValue>
</discriminator>
<sift>
<!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime -->
<appender name="FILE-${logFileName}"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${USER_HOME}/${logFileName}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} %mdc [%thread] %level %logger{35} - %msg%n
</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${USER_HOME}/${logFileName}.%i.log.zip
</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
</sift>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="com.mkyong.analyzer.core" level="debug"
additivity="false">
<appender-ref ref="FILE-THREAD" />
<appender-ref ref="STDOUT" />
</logger>
<root level="error">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2. Java线程示例
一个简单的线程示例,通过MDC.put
声明了'logFileName'值
Head.java
package com.mkyong.analyzer.core;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Head implements Runnable {
static Logger logger = LoggerFactory.getLogger(Head.class);
private String name;
@Override
public void run() {
MDC.put('logFileName', getName());
logger.debug("hello");
//remember remove this
MDC.remove('logFileName');
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
开始10个线程
int count = 1;
while(count<=10){
Head head = new Head();
head.setName("head-" + count);
threadPools.execute(head);
count++;
}
输出:10个线程的10个单独的日志文件。
注意
使用此MDC功能,您甚至可以将每个登录用户,每个URI请求,每个远程主机等的输出记录到单独的日志文件中。
参考文献
翻译自: https://mkyong.com/logging/logback-different-log-file-for-each-thread/