基于slf4j实现多线程日志

对于多线程的程序来说,排错是一件特别麻烦的事情,特别是针对日志,多线程有可能发生日志写阻塞,那我们有没有可能每一个线程一个日志文件呢?答案是可以的,基于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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏爱撒谎的男孩

Springmvc之向JSP页面提供数据(request,session)

36240
来自专栏Albert陈凯

2018-04-27 读配置文件到静态变量中,加载properties到static变量field

项目的配置文件要写到jar档外面,提供给运维人员更改,基于这个需求,就会有很多的常量需要从外部文件读取进来 JAVA最常见的就是properties文件,提供k...

36890
来自专栏公众号_薛勤的博客

[转]Spring基础知识汇总 Java开发必看

Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通...

15030
来自专栏微信公众号:Java团长

Spring Boot属性配置和使用

Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置。

14010
来自专栏Spring相关

第3章—高级装配—条件化的Bean

通过活动的profile,我们可以获得不同的Bean。Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解。

10020
来自专栏java工会

Java 必看的 Spring 知识汇总!有比这更全的算我输!

22620
来自专栏Java Web

Spring(3)——装配 Spring Bean 详解

装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中...

50940
来自专栏JavaEdge

使用Spring Data JPA访问关系型数据库添加数据库和jpa依赖定义实体对象创建对象访问方法总结

我们将定义一个实体对象UserApply并将其存储到关系型数据库中,并使用JPA注解:

10720
来自专栏Java 技术分享

SpringMVC(一)

12920
来自专栏Java3y

SpringMVC【开发Controller】详解

前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方法接收参数 字...

36980

扫码关注云+社区

领取腾讯云代金券