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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 问题背景线上某个新管理型系统出现了日志无法按天切割生成日志文件的问题,所有的日志都在一个日志文件里面,只有每次重启的时候才会重新生成文件。这个管理系统使用的是 Spring Boot + Logback 框架,查看了 Logback 的日志文件,发现了策略组合使用问题。

问题背景

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

这个管理系统使用的是 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
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 JSON 缓存
十行代码让日志存储降低80%
十行代码让日志存储降低80%
88 2
|
Java API Maven
一文搞懂Java日志级别,重复记录、丢日志问题(下)
一文搞懂Java日志级别,重复记录、丢日志问题
1098 0
一文搞懂Java日志级别,重复记录、丢日志问题(下)
|
6天前
|
应用服务中间件 Linux nginx
Nginx log 日志文件较大,按日期生成 实现日志的切割
Nginx log 日志文件较大,按日期生成 实现日志的切割
27 0
|
7天前
|
关系型数据库 MySQL Linux
Linux——日志文件按天切割
Linux——日志文件按天切割
22 0
|
应用服务中间件 Shell nginx
网站流量日志埋点收集—日志格式、日志切分|学习笔记
快速学习网站流量日志埋点收集—日志格式、日志切分
282 0
网站流量日志埋点收集—日志格式、日志切分|学习笔记
|
机器学习/深度学习 算法 数据安全/隐私保护
算法日志——第二天
算法日志——第二天
102 0
算法日志——第二天
|
Java 测试技术 微服务
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(下)
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(下)
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(下)
|
算法 Java 微服务
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(上)
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(上)
为什么我建议线上高并发量的日志输出的时候不能带有代码位置(上)
|
XML 运维 Java
一文搞懂Java日志级别,重复记录、丢日志问题(上)
一文搞懂Java日志级别,重复记录、丢日志问题
245 0
一文搞懂Java日志级别,重复记录、丢日志问题(上)
|
Java
一文搞懂Java日志级别,重复记录、丢日志问题(中)
一文搞懂Java日志级别,重复记录、丢日志问题
539 0
一文搞懂Java日志级别,重复记录、丢日志问题(中)