1. 描述
logback 日志文件大小超出maxFileSize值后,没创建新日志文件,抛出NullPointerException。
- 配置:
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 滚动策略: TimeBasedRollingPolicy按时间滚动;SizeAndTimeBasedRollingPolicy按日期归档文件,但同时限制每个日志文件的大小-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径&日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}_%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数(maxHistory属性优先级高于totalSizeCap)-->
<maxHistory>15</maxHistory>
<totalSizeCap>50KB</totalSizeCap>
</rollingPolicy>
<!--日志文件最大的大小, 默认值10MB-->
<TriggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10KB</maxFileSize>
</TriggeringPolicy>
<encoder>
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</encoder>
</appender>
- 环境
IDE: 2021.3
spring boot: 2.5.6 (spring-boot-starter-logging: 2.5.6 --- logback-classic: 1.2.6)
2. 问题
- ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE_ALL] - Appender [FILE_ALL] failed to append. java.lang.NullPointerException
- 原因:
总结:
RollingFileAppender.subAppend方法中执行的不是TimeBasedRollingPolicy自身的isTriggeringEvent方法,所以出现对应不上的问题。
3. 解决
- 配置TimeBasedRollingPolicy的TimeBasedFileNamingAndTriggeringPolicy属性。
<!-- 日志输出:RollingFileAppender-根据rollingPolicy(滚动策略)和TriggeringPolicy(触发策略)输出日志 -->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 滚动策略: TimeBasedRollingPolicy按时间滚动;SizeAndTimeBasedRollingPolicy按日期归档文件,但同时限制每个日志文件的大小-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径&日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}_%d{yyyy-MM-dd}.part_%i.log.log</FileNamePattern>
<!--日志文件保留天数(maxHistory属性优先级高于totalSizeCap)-->
<maxHistory>15</maxHistory>
<totalSizeCap>50KB</totalSizeCap>
<!-- appender启动时,进行一次日志文件清理(作用:有些存活很短时间的应用,没机会进行文件清理) -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</encoder>
</appender>
- 结果:
4. 滚动策略与触发策略
<!-- 对应一: FixedWindowRollingPolicy + SizeBasedTriggeringPolicy -->
<appender name="FILE_1" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10KB</maxFileSize>
</triggeringPolicy>
</appender>
<!-- 对应二: 时间(TimeBasedRollingPolicy + DefaultTimeBasedFileNamingAndTriggeringPolicy)-->
<appender name="FILE_2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 默认策略可以不配置-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy" />
</rollingPolicy>
</appender>
<!-- 对应三:时间和文件大小(TimeBasedRollingPolicy + SizeAndTimeBasedFNATP)-->
<appender name="FILE_3" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
5. 资料
logback 手册appender标签:https://logback.qos.ch/manual/appenders.html