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日志并进行多维度分析。
目录
相关文章
|
25天前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
25天前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
29天前
|
XML Java API
Java日志通关(四) - Logback 介绍
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第四篇。
|
1月前
|
XML Java Maven
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
这篇文章详细介绍了如何在Spring Boot项目中使用logback进行日志记录,包括Maven依赖配置、logback配置文件的编写,以及实现的日志持久化和控制台输出效果。
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
|
1月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
2月前
|
安全 Java
Logback 实现日志链路追踪
Logback 实现日志链路追踪
62 1
|
1月前
|
数据可视化 Java API
如何在项目中快速引入Logback日志并搭配ELK使用
如何在项目中快速引入Logback日志并搭配ELK使用
|
2月前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
【7月更文挑战第9天】在Java项目中,使用Logback配置可以实现日志按照不同包名输出到不同的文件,并且根据日志级别分开记录。
69 4
|
2月前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
【7月更文挑战第8天】这篇教程介绍了如何使用Logback将Java应用的日志输出到文件中。首先,通过创建`logback.xml`配置文件,设置`FileAppender`来指定日志文件路径和格式。然后,提供了一个`RollingFileAppender`的例子,用于每日生成新的日志文件并保留一定天数的历史记录。文中包含配置文件的XML代码示例,并展示了控制台输出和生成的日志文件内容。教程最后提到了一些可能遇到的问题及解决建议。
31 0
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
|
2月前
|
Java 关系型数据库 测试技术
《手把手教你》系列基础篇(八十九)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-上篇(详解教程)
【7月更文挑战第7天】Apache Log4j2的安全漏洞促使考虑使用logback作为替代的日志框架。Logback由log4j创始人设计,提供更好的性能,更低的内存使用,并且能够自动重载配置文件。它分为logback-core、logback-classic(实现了SLF4J API)和logback-access(用于Servlet容器集成)三个模块。配置涉及Logger、Appender(定义日志输出目的地)和Layout(格式化日志)。
48 1