您的位置:首页 > 移动开发

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

2017-10-12 14:26 686 查看
本文介绍如何使用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信息中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐