对于多线程的程序来说,排错是一件特别麻烦的事情,特别是针对日志,多线程有可能发生日志写阻塞,那我们有没有可能每一个线程一个日志文件呢?答案是可以的,基于slf4j的MDC,具体MDC原理各位看官自行百度
直接上代码
/**
* Created by shengjk1 on 2017/11/30
*/
public class Main {
protected final static org.slf4j.Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String[] destinations = {"a","b","c"};
logger.info("开始启动 ");
Thread thread=null;
for (final String destination:destinations ) {
thread=new Thread(new Runnable() {
@Override
public void run() {
MDC.put("logFileName", destination);
//自己要运行的代码如 ClusterCanalClient.run(destination);
MDC.remove("logFileName");
}
});
thread.setName(destination);
thread.start();
}
}
}
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scanPeriod="30 seconds" debug="false">
<jmxConfigurator/>
<property name="log.path" value="/home/shengjk1/canaljar/logs/data_exchange" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</appender>
<!-- This is MDC value -->
<!-- We will assign a value to 'logFileName' via Java code -->
<appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>logFileName</key>
<defaultValue>logback</defaultValue>
</discriminator>
<sift>
<!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<-以logFileName开头的log文件->
<file>${log.path}/${logFileName}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %mdc [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<!--<!–按照文件大小进行滚动–>-->
<!--<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">-->
<!--<FileNamePattern>logback.log.%i.bak</FileNamePattern>-->
<!--<MinIndex>1</MinIndex>-->
<!--<MaxIndex>12</MaxIndex>-->
<!--</rollingPolicy>-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${log.path}/${logFileName}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<MaxFileSize>100MB</MaxFileSize>-->
<!--</triggeringPolicy>-->
</appender>
</sift>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE-THREAD"/>
</root>
</configuration>