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


    问题背景

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

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

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

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    
    </appender>

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

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

    解决办法

    1、去掉组合策略 triggeringPolicy

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    
    </appender>

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

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/info.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <maxFileSize>20MB</maxFileSize>
        </rollingPolicy>
    
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

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

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

    问题偶遇

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

    image

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

    如果你对此还有其他的解决方案,欢迎留言。想深入交流,或者对我们所有文章知识点有困惑的,扫描正文公众号,并在后台回复”星球”加入我们的知识星球一起学习。

    推荐:Spring Boot & Cloud 最强技术教程

    扫描关注我们的微信公众号,干货每天更新。

    image

  • 相关阅读:
    用于 Windows8 的 Wijmo Charts 图表控件
    Silverlight 版 C1OutlookBar 初体验
    TX Text Control文字处理教程(12)MS Word中字段的导入导出操作
    TX Text Control文字处理教程(5)数据库操作
    TX Text Control文字处理教程(10)创建报价单
    TX Text Control文字处理教程(9)XML文件
    在 ActiveReports 中嵌入 Spread 控件
    TX Text Control文字处理教程(8)使用超链接
    TX Text Control文字处理教程(11)使用文本框
    2012春节快到了我们聚会吧!
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952456.html
Copyright © 2020-2023  润新知