查看原文
其他

坑爹的日志无法按天切割问题!

R哥 Java技术栈 2018-08-06


Java技术栈

优质的 Java 技术公众号

 


问题背景

线上某个新管理型系统出现了日志无法按天切割生成日志文件的问题,所有的日志都在一个日志文件里面,只有每次重启的时候才会重新生成文件。

这个管理系统使用的是 Spring Boot + Logback 框架,查看了 Logback 的日志文件,发现了策略组合使用问题。

以下是有问题的日志配置代码。

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  2.    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  3.        <level>INFO</level>

  4.    </filter>

  5.    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  6.        <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>

  7.        <MaxHistory>30</MaxHistory>

  8.    </rollingPolicy>

  9.    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

  10.        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

  11.    </encoder>

  12.    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

  13.        <MaxFileSize>10MB</MaxFileSize>

  14.    </triggeringPolicy>

  15. </appender>

该配置使用了基于时间的滚动切割策略 TimeBasedRollingPolicy,每天0点自动生成一份新的日志文件。

但里面包含了一段 triggeringPolicy 触发策略,即最大单个文件超过 10MB 自动新成新日志文件, TimeBasedRollingPolicy 是基于时间的,不能和其他策略一起组合使用。

解决办法

1、去掉组合策略 triggeringPolicy

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  2.    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  3.        <level>INFO</level>

  4.    </filter>

  5.    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  6.        <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>

  7.        <MaxHistory>30</MaxHistory>

  8.    </rollingPolicy>

  9.    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

  10.        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

  11.    </encoder>

  12. </appender>

2、使用时间和大小组合策略 SizeAndTimeBasedRollingPolicy

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  2.    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  3.        <level>INFO</level>

  4.    </filter>

  5.    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

  6.        <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>

  7.        <MaxHistory>30</MaxHistory>

  8.        <maxFileSize>20MB</maxFileSize>

  9.    </rollingPolicy>

  10.    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

  11.        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

  12.    </encoder>

  13. </appender>

注意后面的 %i 是必须要加上去的,是单个日志文件超大小后的切割序号。

使用以上两种方案都可以解决 Logback 无法按天切割生成日志的问题,如果这两种解决不了你的问题,那你也要检查下你的滚动策略是否使用正确。

问题偶遇

巧了,Java技术栈知识星球上也有球友遇到了这类问题。

他使用了 Resin + Log4j 框架,还是要检查配置,配置错了一点就会导致无法正常生成滚动日志文件。。。

如果你对此还有其他的解决方案,欢迎留言。想深入交流,或者对我们所有文章知识点有困惑的,都可以点击左下方的阅读原文链接加入我们的知识星球一起学习。

-END-

不错,转发分享一下吧


往期推荐

 

【1】高级 Java 面试通关知识点整理!

【2】Spring Boot & Cloud 最强教程

【3】程序员面试常遇到的十大“套路”

【4】到底什么是跨域?附解决方案!

【5】各种付费技术专栏优惠海报!

点击阅读原文,加入Java技术栈知识星球!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存