狼烟烽火 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>