引言
用过Logback的同学们大多都知道Logback日志框架可以自动按照某个时间点切割日志的功能。但了解其中工作原理的同学可能并不是很多。楼主今天就带领各位了解一下其中的核心源码。本文的示例引用了Logback 1.1.7版的源码。
举个实际的例子,如果希望某一个Appender按天切割日志,那么我们需要类似如下的配置:
logs/service-log.log
%d{yyyy-MM-dd HH:mm:ss} %level [%class:%line] - %m%n
logs/service-log.%d{yyyy-MM-dd}.log.zip
如果需要日志切割功能,首先要选用RollingFileAppender这种Appender,之后要配置TimeBasedRollingPolicy作为该Appender的滚动策略。
源码解读
业务代码在调用Logback的记录日志的方法时,Logger类会调用ch.qos.logback.core.Appender#doAppend方法。Appender的doAppend就是Appender记录日志功能的入口。
我们先来看一下RollingFileAppender的继承关系
看起来貌似有些晕。没关系,doAppend方法经过几层之后会调到ch.qos.logback.core.rolling.RollingFileAppender#subAppend 这个方法。而跟日志切割相关的逻辑就在这里面。因此从doAppend到subAppend之间的调用链路我们在此略过不提,而是从subAppend这个方法切入。
/**
* This method differentiates RollingFileAppender from its super class.
*/
@Override
protected void subAppend(E event) {
// The roll-over check must precede actual writing. This is the
// only correct behavior for time driven triggers.
// We need to synchronize on triggeringPolicy so t