基于slf4j实现多线程日志

版权声明:本文为博主原创,欢迎转载,转载请标明出处 Blog Address:http://blog.csdn.net/jsjsjs1789 https://blog.csdn.net/jsjsjs1789/article/details/79252947

对于多线程的程序来说,排错是一件特别麻烦的事情,特别是针对日志,多线程有可能发生日志写阻塞,那我们有没有可能每一个线程一个日志文件呢?答案是可以的,基于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 = ConfigManager.build().getProperty("destination").split(",",-1);
        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>
                <!--&lt;!&ndash;按照文件大小进行滚动&ndash;&gt;-->
                <!--<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>

猜你喜欢

转载自blog.csdn.net/jsjsjs1789/article/details/79252947