logback实现每个用户一个独立的日志文件
2017-10-12 14:26
686 查看
本文介绍如何使用logback的
id注入到MDC,实现按session分隔日志,或者简单的将session呈现到log信息中。
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;PS:利用logback的MDC特性,实际项目中,可以实现按请求url、用户、host等粒度进行日志文件的独立分隔。,如web项目中,可通过拦截器将session
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();
}
}
id注入到MDC,实现按session分隔日志,或者简单的将session呈现到log信息中。
相关文章推荐
- logback实现每个线程一个独立的日志文件
- 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
- 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
- 扔掉log4j、log4j2,自己动手实现一个多功能日志记录框架,包含文件,数据库日志写入,实测5W+/秒日志文件写入,2W+/秒数据库日志写入,虽然它现在还没有logback那么强大
- log4j实现每个线程保存一个日志文件
- 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
- log4j实现每个线程保存一个日志文件
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- SHELL实现取出一个目录下所有日志文件中的所有IP地址并去重
- 请问:如何实现文件日志功能?要求每天换一个文件。文件名以日期区分
- 从Apache的日志文件收集和提供统计数据(一个Python插件架构的简单实现)
- 寻找热门查询:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
- 让Log4CPLUS每个CPP记一个日志文件
- ASP.NET文件上传,为每个用户建立一个上传目录
- python logging 模块之TimedRotatingFileHandler 实现每天一个日志文件
- 编写一个程序 提示用户输入三个数集,每个包括5个数 实现以下功能 (图)
- 简单实现:如何把所有的日志记录到同一个文件中???
- 本文以python实现了一个日志文件中ip提取与统计程序
- C# 实现一个Log日志文件 以每2Mb创建一个新的日志
- apache 日志为每个域名独立配置单独的日志文件