logback中 maxHistory 属性无效

14 篇文章 0 订阅

1. 描述

logback的滚动策略中配置了 maxHistory 之后,日志目录下依旧存在很多(超出策略时间之外)日志。

  • 环境
IDE: 2021.3
spring boot: 2.5.6 (spring-boot-starter-logging: 2.5.6 --- logback-classic: 1.2.6)
  • logback配置:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
	<FileNamePattern>${LOG_PATH}/error/${LOG_NAME}_error.%d{yyyy-MM-dd}.part_%i.log.zip</FileNamePattern>
	<!--日志文件保留天数(maxHistory属性优先级高于totalSizeCap)-->
	<maxHistory>3</maxHistory>
	<!-- 总文件超出大小删除老文件(需要设置maxHistory后生效) -->
	<totalSizeCap>20KB</totalSizeCap>
	<maxFileSize>10KB</maxFileSize>
	<!-- appender启动时,进行一次日志文件清理(作用:有些存活很短时间的应用,没机会进行文件清理) -->
	<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

2. 问题

  • 配置策略,根据时间滚动,保留3天内的日志,如图,依然存在很多以前的日志文件。

  • 原因: 默认第一次只清理32天内的日志内容,之后清理上一次处理之后的。超过时间之前的日志文件,不在清理范围内,所以没被清理。

  • ```

3. 日志清理流程

1. 获取时间段(当前时间到上一次清理时间):日志文件清理仅限于此时间范围。
2. 计算周期(时间段内有多少个周期):如:第一次,按天就是32,按小时就是 32 * 243. 找出每个周期内的日志文件。
4. 删除日志文件。
  • eg:SizeAndTimeBasedRollingPolicy策略,代码如下
   // 文件删除策略:TimeBasedArchiveRemover
   public void clean(Date now) {
       long nowInMillis = now.getTime();
       // for a live appender periodsElapsed is expected to be 1
       // 计算周期
       int periodsElapsed = computeElapsedPeriodsSinceLastClean(nowInMillis);
       lastHeartBeat = nowInMillis;
       if (periodsElapsed > 1) {
           addInfo("Multiple periods, i.e. " + periodsElapsed + " periods, seem to have elapsed. This is expected at application start.");
       }
       // 遍历清理,每个周期内文件,并删除
       for (int i = 0; i < periodsElapsed; i++) {
           int offset = getPeriodOffsetForDeletionTarget() - i;
           Date dateOfPeriodToClean = rc.getEndOfNextNthPeriod(now, offset);
           cleanPeriod(dateOfPeriodToClean);
       }
   }

   // 计算周期
   int computeElapsedPeriodsSinceLastClean(long nowInMillis) {
       long periodsElapsed = 0;
       if (lastHeartBeat == UNINITIALIZED) {
           addInfo("first clean up after appender initialization");
           periodsElapsed = rc.periodBarriersCrossed(nowInMillis, nowInMillis + INACTIVITY_TOLERANCE_IN_MILLIS);
           periodsElapsed = Math.min(periodsElapsed, MAX_VALUE_FOR_INACTIVITY_PERIODS);
       } else {
           periodsElapsed = rc.periodBarriersCrossed(lastHeartBeat, nowInMillis);
           // periodsElapsed of zero is possible for size and time based policies
       }
       return (int) periodsElapsed;
   }
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果logback.xml配置无效,可以按照以下步骤进行排查和解决问题。 首先,可以将debug模式设置为true,这样可以查看logback.xml的读取日志记录,包括其的各种策略逻辑。具体的日志查看方式可能因程序而异,但通常在程序启动时就会有相应的日志输出。通过查看日志,可以发现是否是自己设置的logback.xml起作用了。确保依赖的jar包包含了正确的logback.xml文件。 如果在生产环境发现设置的logback.xml配置不起作用,可以尝试在启动时通过命令行参数指定logback配置文件,例如使用java -jar启动时加上-Dlogging.config=./conf/logback-spring.xml。这样可以确保使用指定的logback.xml配置文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [logback.xml不生效的原因](https://blog.csdn.net/puzzledboylhc/article/details/119207271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [logback.xml配置无效](https://blog.csdn.net/FaceFullofConfused/article/details/103690112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值