网上有很多文章介绍了如何将不同线程产生的日志输出到不同的日志文件中,使用的是Logback的SiftingAppender,例子如下:
<appender name="siftInfo" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>logName</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${logName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{35} - %msg%n</pattern>
</encoder>
<file>./logs/user-${logName}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./logs/%d{yyyyMMdd}/user-${logName}-%i.log</fileNamePattern>
<maxFileSize>500MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
</sift>
</appender>
但在实际中,可能只想针对某一个线程输出到指定日志文件中,这时就需要使用Filter,实现根据线程信息对日志进行过滤:
package ch.qos.logback.classic.filter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;
public class ThreadFilter extends AbstractMatcherFilter<ILoggingEvent> {
private String threadName;
public FilterReply decide(ILoggingEvent event) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
if (event.getThreadName().equals(threadName)) {
return onMatch;
} else {
return onMismatch;
}
}
public void setThreadName(String threadName) {
this.threadName = threadName;
}
public void start () {
if (this.threadName != null) {
super.start();
}
}
}
logback.xml中添加ThreadFilter:
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${projectname}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/${projectname}.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>d{yyy-MM-dd HH:mm:ss.SSS}[%thread] %-5level %logger{20} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThreadFilter">
<!-- 线程名称 -->
<threadName>main</threadName>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
这样就可以将main线程中生产的日志打印到指定文件。