狼烟烽火 2016-01-23
前言:
使用logback 来记录日志真是一个不错的选择,正像logback官网上介绍的那样:
logback扩展了log4j很多功能,以前一直不明白logback好在哪儿,因为log4j完全够用了,为啥还要用logback来写日志呢? 直到有一天用log4j来记录日志被一个问题所难住了。
问题1:
需要以天为单位记录日志,每天生成一个日志文件,比如xxx.log.yyyy-mm-dd,很自然就想到log4j的appender类 DailyRollingFileAppender,但是发现一个问题,使用这个appender没有办法设置MaxFileSize 这个值,不能控制最大文件数,时间一长服务端的磁盘就被历史日志给撑爆了,所以只能在服务端启动一个定时脚本定时去清理历史文件,或者,要自己写代码去扩展DailyRollingFileAppender的行为,加入自动清理历史日志的功能。但是经过实践都不是最佳解决方案,不是说不能实现,只是实现过程有很多细节需要处理。
问题2:
因为系统是一个SAAS系统,所以系统记录日志希望按照有系统用户来区分,即一个用户一个日志文件,行为日志都记录在各自的日志文件中。如果第一个问题还能通过某种方式是适配实现的话,那这个需求用log4j基本没有可能实现了,或者实现起来要很费周折了。
新的发现:
偶然间在百度上发现,使用logback的siftingappender 可以轻松解决以上第二个问题。http://bbs.csdn.net/topics/390401271?page=1 。
在执行的上下文开始地方设置线程绑定参数,例如:MDC.put("app", onsListener.getCollectionName());
配置logback.xml 放置在classpath的根目录上,配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<encoding>${loggingCharset}</encoding>
<!-- <filter class="com.alibaba.citrus.logconfig.logback.LevelRangeFilter">
<levelMax>INFO</levelMax> </filter> -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %level %X{app} %logger{35}- %msg%n]]></pattern>
</layout>
</appender>
<appender name="statis" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<Key>app</Key>
<DefaultValue>unknown</DefaultValue>
</discriminator>
<sift>
<appender name="FILE-${app}"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.dir}/incr/incr-${app}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/incr/%d{yyyy-MM-dd}-incr-${app}.log
</fileNamePattern>
<maxHistory>8</maxHistory>
</rollingPolicy>
<encoder>
<pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %level %logger{35}- %msg%n]]></pattern>
</encoder>
</appender>
</sift>
</appender>
<logger name="com.dfire.tis.realtime.transfer">
<level value="INFO" />
<appender-ref ref="statis" />
</logger>
<root>
<level value="ERROR" />
<appender-ref ref="STDOUT" />
</root>
</configuration> maven依赖:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.3</version> </dependency>