首页 > 其他分享 >logback过期日志文件自动删除

logback过期日志文件自动删除

时间:2022-12-07 17:42:47浏览次数:60  
标签:文件 滚动 删除 过期 maxHistory 归档 日志 logback


前言

logback应该是目前最主流的日志框架了,在实际使用中经常遇到打印的日志文件不会自动删除,导致日志文件占有大量磁盘空间的问题。

本文主要介绍logback日志文件自动删除的实现机制。


一、官方文档介绍

官方文档地址:​​logback​

1、ConsoleAppender

说明:
如果希望日志打印到控制台,需要配置​​​ConsoleAppender​​控制台日志追加。

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>

<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>

2、RollingFileAppender

说明:
如果希望打印生成的日志文件根据日志大小和时间自动滚动生成新的日志文件,需要配置​​​RollingFileAppender​​滚动日志追加。滚动策略选择SizeAndTimeBasedRollingPolicy基于日志大小和时间滚动。

下面的配置是限制每个文件最多100mb,保存30天的历史记录,日志总大小最多20gb。

<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_FILE}-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!--日志大小-->
<maxFileSize>100MB</maxFileSize>
<!--日志保留时长-->
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>

<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
<configuration>

参数说明:

  • ​file​​ 生成的日志名称
  • ​rollingPolicy​​ 滚动策略,这里采用的SizeAndTimeBasedRollingPolicy,基于日志文件大小和时间滚动。
  • ​fileNamePattern​​​ 定义翻转(归档)日志文件的名称。
    它的值应该包括文件的名称以及适当放置的% d 转换说明符。% d 转换说明符可能包含日期和时间模式。如果省略了日期和时间模式,则假定使用默认模式 yyyy-MM-dd。翻转周期是从 fileNamePattern 的值推断出来的。这里的滚动周期需要和maxHistory配合使用。
  • ​maxFileSize​​ 单个日志文件的最大体积,到达最大体积后就会触发日志滚动操作,生成新的日志文件
  • ​maxHistory​​ 要保存的归档文件的最大数量,以异步方式删除旧文件。例如,如果通过fileNamePattern中的%d{yyyy-MM}指定滚动周期为月度滚动,并将 maxHistory 设置为6,那么存档文件中超过6个月的文件将被删除。
  • ​totalSizeCap​​​ 控制所有归档日志文件的总大小。当超出总大小上限时,将异步删除最早的归档日志文件。设置totalSizeCap 属性还要求设置 maxHistory 属性。优先“最大历史”限制,其次是“总大小上限”的限制。
    按照实际业务情况配置 totalSizeCap ,可以有效避免占用过大的磁盘空间。
    比如你希望 maxHistory 保留7天日志文件,但是可能这7个文件总大小超出磁盘容量,所以可以通过 totalSizeCap 来控制总大小,这样系统会判断大于此值时进行自动覆盖。
    注意⚠️:单独配置totalSizeCap是没有意义的,一定要同时配置maxHistory属性,且大于0,才能实现超过总大小上限异步删除。
  • ​cleanHistoryOnStart​​​ 是否在应用启动的时候删除历史日志。
    如果设置为真,将在启动应用程序时执行档案删除。默认情况下,此属性设置为 false。归档日志移除通常在滚动期间执行。但是,有些应用程序的存活时间可能不够长,无法触发滚动。因此,对于如此短命的应用程序,删除存档可能永远没有机会执行。通过将 cleanHistoryOnStart 设置为 true,将在启动 appender 时执行档案删除。
  • ​encoder​​ 控制输出日志的格式和编码。

二、效果测试

说明:为了测试效果,修改配置,
通过fileNamePattern属性中的%d{yyyy-MM-dd_HH-mm}指定滚动周期为分钟。
maxFileSize控制日志文件超过10kb就触发滚动。
maxHistory属性结合fileNamePattern中解析出现的滚动周期,实现最多保留近3分钟的归档日志。
totalSizeCap控制所有归档日志文件的总大小不超过20kb。

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_FILE}-%d{yyyy-MM-dd_HH-mm}.%i.gz</fileNamePattern>
<!--日志大小-->
<maxFileSize>10KB</maxFileSize>
<!--日志保留时长-->
<maxHistory>3</maxHistory>
<totalSizeCap>20KB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>

测试一:

项目启动后,持续调用方法生成日志文件:

logback过期日志文件自动删除_自动删除


执行结果:

归档日志(带时间后缀的这些滚动生成的日志文件)总大小超过20kb后,就会触发删除操作。

说明totalSizeCap配置属性生效。测试二:

间隔3分钟后,在调用方法生成日志。

logback过期日志文件自动删除_logback_02


执行结果:

3分钟前的日志文件全部被删除,说明fileNamePattern和maxHistory配置最多保留近3分钟的归档日志生效。

测试三:
生成一批归档日志文件后,3分钟后重启项目,校验是否在项目启动是清理日志。
这里为了验证结果的正确性,需要保证项目重启过程中生成的日志大小不超过maxFileSize,不触发日志滚动。

项目启动生成日志:刚好9kb,没有触发滚动。

logback过期日志文件自动删除_maxHistory_03


调用方法,生成日志文件:

logback过期日志文件自动删除_日志文件_04


为避免触发滚动,删除log文件,3分钟后重启项目:

logback过期日志文件自动删除_logback_05


执行结果:

3分钟前的日志文件全部被删除,说明cleanHistoryOnStart配置生效,在项目启动的时候会检查是否有需要删除的归档日志文件。


总结

本文主要介绍了logback过期的日志文件的自动删除机制如何配置。有如下参数需要注意:
1、​​​RollingFileAppender​​​控制滚动日志文件追加。
2、​​​SizeAndTimeBasedRollingPolicy​​​用来配置采用基于大小和时间的滚动策略。
3、​​​fileNamePattern​​​既控制滚动日志的命名模式,也控制maxHistory的滚动周期。
4、​​​maxFileSize​​​控制日志最大多少触发滚动。
5、​​​maxHistory​​​控制归档日志的保留时长,需要和fileNamePattern中的%d{yyyy-MM-dd}解析的滚动周期一起使用。
6、​​​totalSizeCap​​​控制归档日志的最大体积是多少,超过会触发删除归档日志操作。需要和maxHistory属性一起使用,只配置totalSizeCap属性但是maxHistory=0时不会触发自动删除操作。
7、​​​cleanHistoryOnStart​​控制是否在项目启动的时候检查是否需要删除归档日志。


标签:文件,滚动,删除,过期,maxHistory,归档,日志,logback
From: https://blog.51cto.com/u_15905482/5919818

相关文章

  • logback控制台彩色日志输出
    一、logback控制台常规日志输出1、常规配置<configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><!--输出模板--><encoder>......
  • logback性能优化详解
    前言不正确的日志打印不但会降低程序运行性能,还会占用大量IO资源和硬盘存储空间。本文主要总结一些能提高日志打印性能的手段。一、通过AsyncAppender异步输出日志我们通常......
  • logback异步输出日志详解
    前言logback应该是目前最流行的日志打印框架了,毕竟SpringBoot中默认的集成的日志框架也是logback。在实际项目开发过程中,常常会遇到由于打印大量日志而导致程序并发降低,QPS......
  • Kafka 日志保留策略(Log Retention Policy)
    Kafka日志保留策略(LogRetentionPolicy)前言一两周前测试kafka,创建了topic:data-time,发布了一部分数据,测试kafka的发布和订阅均正常。一两周后,也就是现在,再次取订阅to......
  • 调试临时日志输出
    一、非控制台程序也可使用控制台输出1、AllocConsole为当前进程分配一个控制台2、在程序中调用printf, cout等函数即可3、FreeConsole不使用时调用释放控制台 如下: intW......
  • Python 日志记录-loguru
    Python日志记录-loguru使用logging模块时用python写代码时,logging模块最基本的几行配置,如下:importlogginglogging.basicConfig(level=logging.INFO,format='%(ascti......
  • java 引入logging日志
    1、yml添加 #日志配置logging:level:#自己的包名com.wrblog:debugorg.springframework:warn 2、在resources下创建logback.xml文件并更改自己的......
  • 日志架构选型
    ......
  • 014.MyBatis日志管理
    1.SLF4j与Logback  2.Logback的使用2.1pom.xml<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</......
  • jsonSchema进行日志格式校验
    jsonSchema官网功能1、属性校验2、属性类型校验3、属性值校验fromjsonschemaimportvalidate,draft7_format_checkerfromjsonschema.exceptionsimportSchemaE......