Logback日志无法按天分割问题小记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Logback日志无法按天分割问题小记

问题描述

线上查看Mqtt消息服务项目时,发现服务器中系统的日志不能按天生成日志文件,全部的日志信息都打印到了启动运行项目的那一天中了且此日志文件越来越大,只有重启项目之后才会生成当天的日志文件。


回想当时开发的时候为什么没有发现?

1. 开发的时候,基本每天都会重启,且日志正常;

2. 部署的时候,打包的时候日志文件夹也会打包进入,当时启动后看了看正常,就所以然了。


分析原因

这个Mqtt消息服务项目使用SpringBoot + Logback框架,查看其配置文件,发现**<font color='red'> 策略组合</font>** 使用问题。

以下是当时项目中的有问题的配置文件

<?xmlversion="1.0" encoding="UTF-8"?><configurationdebug="false"><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--><propertyname="LOG_HOME"value="./logs"/><!--配置CONSOLE控制台文件输出项--><appendername="CONSOLELOG"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS } [%thread] %-5level %logger{50} - %msg  %n</pattern></encoder></appender><!--配置INFO文件输出项--><appendername="DAYINFOLOG"class="ch.qos.logback.core.rolling.RollingFileAppender"><filterclass="ch.qos.logback.classic.filter.LevelFilter"><!--过滤error日志--><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><!--配置滚动策略--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按照每天生成日志文件 --><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}-info.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小--><triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!--配置ERROR文件输出项--><appendername="DAYERRORLOG"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--比较日志记录请求的Level值和ThresholdFilter中配置的Level值当日志记录请求的Level值小于ThresholdFilter中配置的Level值,日志记录请求被判定为无效--><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><!--配置滚动策略--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按照每天生成日志文件 --><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/error/%d{yyyy-MM-dd}-error.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern></encoder><!--日志文件最大的大小--><triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 日志输出级别 --><rootlevel="INFO"><appender-refref="CONSOLELOG"/><appender-refref="DAYINFOLOG"/><appender-refref="DAYERRORLOG"/></root></configuration>

配置中使用了基于时间的滚动切割策略 **TimeBasedRollingPolicy**,每天凌晨0点自动生成新的日志文件。但是可以注意到里面包含了一段 triggeringPolicy触发策略,即最大单个文件超过 10MB 自动新成新日志文件, TimeBasedRollingPolicy 是基于时间的,不能和其他策略一起组合使用。


这个配置文件包含了两个策略:

1. 时间维度;

2. 文件大小维度;


解决方案


方案一:去掉组合策略 <font color='red'>**triggeringPolicy** </font>

<appendername="DAYINFOLOG"class="ch.qos.logback.core.rolling.RollingFileAppender"><filterclass="ch.qos.logback.classic.filter.LevelFilter"><!--过滤error日志--><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><!--配置滚动策略--><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按照每天生成日志文件 --><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}-info.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender>  // 错误输出日志同理,不再只是展示
```
方案二:使用时间和大小组合策略 <fontcolor='red'> **SizeAndTimeBasedRollingPolicy **</font>```xml
<appendername="DAYINFOLOG"class="ch.qos.logback.core.rolling.RollingFileAppender"><filterclass="ch.qos.logback.classic.filter.LevelFilter"><!--过滤error日志--><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch></filter><!--配置滚动策略--><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 按照每天生成日志文件 --><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}-info-%i.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory><maxFileSize>20MB</maxFileSize></rollingPolicy><encoderclass="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender>


注意事项

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

注意后面的<font color='red'> `%i`</font>是必须要加上去的,是单个日志文件超大小后的切割序号,以便我们分析处理。


使用以上两种解决方案都可以解决Logback不能按天切割生成日志文件的问题,

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
22天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
167 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
20天前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
64 5
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
250 3
|
2月前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
36 2
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
102 1
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
4月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
4月前
|
XML Java API
Java日志通关(四) - Logback 介绍
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第四篇。
|
4月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
4月前
|
数据可视化 Java API
如何在项目中快速引入Logback日志并搭配ELK使用
如何在项目中快速引入Logback日志并搭配ELK使用