日志的不同维度分割在实际业务中比较常见,如在线特征日志打印比较多,可能用一定的时间粒度进行分割,也有按照文件大小进行分割,以保证日志的迁移便利性、磁盘空间的节省等作用。
按时间分割
按时间分割日志,一般主要是按天、小时等粒度进行分割,甚至有些可能按分钟时间粒度进行切割日志。
在 logback 里时间分割的对应 rolling 策略类是 ch.qos.logback.core.rolling.TimeBasedRollingPolicy
,并在 fileNamePattern
的配置中添加一个日期目录:%d{yyyyMMdd,aux}
,具体示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<Pattern>%msg %n</Pattern>
</encoder>
<!-- 按时间分割 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件的路径与名称,{yyyyMMdd-HH} 精确到小时,则按小时分割保存 -->
<fileNamePattern>
demo_logs/%d{yyyyMMdd,aux}/demo.%d{yyyyMMdd-HH}.log
</fileNamePattern>
<!-- 如果当前是按小时保存,则保存 120 小时(= 5 天)内的日志 -->
<MaxHistory>120</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="fileAppender"/>
</root>
</configuration>
从如上示例中,我们发现时间配置中,出现了 aux
的模式配置符,它的意思是说,可以在 fileNamePattern 配置中添加多个 %d 的日期符号,但是只能有一个是主要的,其它的只能做为辅助(auxiliary)。在 RollingCalendar 类中,日志的文件滚动方式就是根据主 %d 那个日期判断的。