基于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 = {"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>
                <!--&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>
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shengjk1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值