logback实现每个用户一个独立的日志文件

来源:互联网 发布:软件服务器的作用 编辑:程序博客网 时间:2024/06/05 07:46

本文介绍如何使用logback的Mapped Diagnostic Context (MDC) 和SiftingAppender实现每个线程一个独立的日志文件。


MDC 参考手册http://logback.qos.ch/manual/mdc.html

1、logback.xml配置文件示例

<configuration><property name="LOG_HOME" value="/home/logs/hawkeye/"/><property name="SERIOUS_PATTERN" value="[%d{yyyyMMdd HH:mm:ss.SSS}][%thread]%5level- %msg%n "/><!-- %X{ip} --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${SERIOUS_PATTERN}</pattern></encoder></appender><appender name="Async_Console" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>256</queueSize><appender-ref ref="STDOUT" /></appender><!-- SiftingAppender实现每个线程一个独立的日志文件 --><appender name="Async_FileLog" class="ch.qos.logback.classic.sift.SiftingAppender"><discriminator>              <key>application.name</key>              <defaultValue>service</defaultValue>          </discriminator>          <sift>  <appender name="FileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><file>${LOG_HOME}/${application.name}/applog/service-info.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/${application.name}/applog/%d{yyyyMMdd}/service-info.%d{yyyyMMdd}.%i.log</fileNamePattern><maxHistory>7</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>200MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${SERIOUS_PATTERN}</pattern></encoder></appender></sift></appender><logger name="com.hualala"><level value="debug" /><appender-ref ref="Async_Console" /><appender-ref ref="Async_FileLog" /></logger></configuration>

2.java线程代码示例

此处通过简单的MDC put与remove来实现每个线程log文件名独立。

package com.yangyi;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.slf4j.MDC;/** * Created by yangjinfeng02 on 2016/6/4. */public class Counter implements Runnable {    private Logger logger = LoggerFactory.getLogger(Counter.class);    private String counterName;    public Counter(String counterName) {        this.counterName = counterName;    }    public void run() {        MDC.put("application.name", counterName);        logger.info("start counter {}", counterName);        MDC.remove("application.name");    }}

package com.yangyi;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by yangjinfeng02 on 2016/6/4. */public class Application {    public static void main(String[] args) {        ExecutorService executorService = Executors.newFixedThreadPool(5);        for (int i = 0; i < 10; ++i) {            executorService.execute(new Counter(String.valueOf(i)));        }        executorService.shutdown();    }}

PS:利用logback的MDC特性,实际项目中,可以实现按请求url、用户、host等粒度进行日志文件的独立分隔。,如web项目中,可通过拦截器将session id注入到MDC,实现按session分隔日志,或者简单的将session呈现到log信息中。