前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于slf4j实现多线程日志

基于slf4j实现多线程日志

作者头像
shengjk1
发布2018-10-24 15:17:28
2.2K0
发布2018-10-24 15:17:28
举报
文章被收录于专栏:码字搬砖码字搬砖码字搬砖

对于多线程的程序来说,排错是一件特别麻烦的事情,特别是针对日志,多线程有可能发生日志写阻塞,那我们有没有可能每一个线程一个日志文件呢?答案是可以的,基于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>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年02月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档