logback历史日志无法自动删除的问题

2023-11-17

例如在logback-spring.xml进行如下配置:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
	<!-- 路径 /www/wwwroot/zqdsj.pasis.cn-->
	<fileNamePattern>${LOG_HOME}/sc-logs/sc-sys.info.%d.log</fileNamePattern>
	<maxHistory>30</maxHistory>
	<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

在TimeBasedRollingPolicy类中调用日志清理

//服务启动时执行日志清理
if (cleanHistoryOnStart) {
    addInfo("Cleaning on start up");
    Date now = new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime());
    cleanUpFuture = archiveRemover.cleanAsynchronously(now);
}

调用TimeBasedArchiveRemover类异步清理

public class ArhiveRemoverRunnable implements Runnable {
    Date now;

    ArhiveRemoverRunnable(Date now) {
        this.now = now;
    }
	//异步进行日志清理
    @Override
    public void run() {
        clean(now);
        if (totalSizeCap != UNBOUNDED_TOTAL_SIZE_CAP && totalSizeCap > 0) {
            capTotalSize(now);
        }
    }
}

计算要删除日志的日期,并匹配日志文件进行删除

int callCount = 0;
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;
        //获取需要删除的日志日期 如今天是2022-09-15 maxHistory为30 则dateOfPeriodToClean是从2022-08-15到2022-07-15 过早的日志则需要手动删除
        Date dateOfPeriodToClean = rc.getEndOfNextNthPeriod(now, offset);
        cleanPeriod(dateOfPeriodToClean);
    }
}
public void cleanPeriod(Date dateOfPeriodToClean) {
    //根据日期获取要清理的文件
    File[] matchingFileArray = getFilesInPeriod(dateOfPeriodToClean);
	//删除匹配到的文件
    for (File f : matchingFileArray) {
        addInfo("deleting " + f);
        f.delete();
    }

    if (parentClean && matchingFileArray.length > 0) {
        File parentDir = getParentDir(matchingFileArray[0]);
        removeFolderIfEmpty(parentDir);
    }
}

结论:

如果要在项目启动时就删除历史日志文件,需要在logback-spring.xml中添加true

另外,过于古老的日志是无法自动清除的,如今天是2022-09-15 maxHistory为30 则日志删除的范围是从 2022-07-15 到 2022-08-15 ,过早的日志则需要手动删除

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

logback历史日志无法自动删除的问题 的相关文章

随机推荐

  • k8s基础概念、ETCD

    原理 和k8s结合点 etcd与k8s的交集 维护 基础概念 物理组件 逻辑组件 网络组件 工作负载 1 物理组件 Master Control plane kube apiserver 提供唯一api接口 提供集群管理接口 用户认证授权
  • 【Qt】使用 setWindowFlags 方法设置窗体的最小化、最大化、关闭按钮

    一 设置方法 void setWindowFlags Qt WindowFlags type Qt WindowFlags 有很多参数 其中 窗口最小化按钮 Qt WindowMinimizeButtonHint 窗口最大化按钮 Qt Wi
  • html 识别文本中的\n 进行换行

    文本内容有 n 怎么换行 1 v html渲染 使用正则将 n 替换成 br 标签 再用v html渲染 this content value replace n g br div div 2 使用css的white space div t
  • 学好少儿编程做人工智能开拓者

    乔布斯曾经说过 人人都应该学习编程 因为它教会你如何思考 格物斯坦小坦克认为少儿编程教育已经不再是一个遥远的话题 它逐渐成为一个趋势 成为一个现实 少儿教育编程行业领域的火爆 也反映出了国家对于少儿编程教育的重视 以及行业对编程人才的刚性需
  • 虚拟化技术7小问

    目录 kvm中的虚拟机cpu核心大于1 虚拟机就不能启动 只能设置为1的时候虚拟机才能启动 是什么原因 如何查看虚拟机宿主机的CPU是否支持硬件虚拟化 宿主机支持虚拟化 是不是还要开启相关的设置 虚拟机中再安装的虚拟机是不是只能是单核的虚拟
  • 存储器基础入门

    1 泰瑞达机台 Magnum VU本身作为一个灵活 集合式的测试平台 可以支持所有NAND以及MCP MCP Multiple Chip Package 存储器 MCP是在一个塑料封装外壳内 垂直堆叠大小不同的各类存储器或非存储器芯片 是一
  • Android TabLayout setupWithViewPager()方法绑定Viewpager不显示文字

    setupWithViewPager 做了什么事情 TabLayout tabLayout findViewById R id tabLayout ViewPager viewPager findViewById R id viewPage
  • spring框架---IOC

    spring框架的概述 spring是轻量级的开源的JavaEE框架 解决企业应用的开发复杂性 spring有两个核心 IOC AOP IOC 控制反转 把创建对象的过程交给Spring进行管理 AOP 面向切面 不修改源代码的进行功能增强
  • SpringBoot小知识点(可能有你不知道的)

    SpringBoot复习 基础部分 1 SpringBoot中配置文件使用 配置文件间的加载优先级 properties 最高 gt yml gt yaml 最低 2 yaml数据读取 对于yaml文件中的数据 其实你就可以想象成这就是一个
  • 【Salvation】——怪物角色动画&主角碰撞死亡动画

    Salvation 怪物角色动画 主角碰撞死亡动画 写在前面 这个动画功能同样也是使用JavaScript编写脚本 在Unity3D游戏引擎的环境中实现 在怪物的角色动画中 很多与人物相同 这里不再重复 一 设计敌人 拖一个精英sprite
  • Tcp通信步骤

    package cn dali4 code01 TCP通信步骤 服务器先启动 服务器端不会主动请求客户端 必须使用客户端请求服务器 客户端和服务器端建立一个逻辑连接 这个链接包含了一个IO对象 客户端和服务器端可以使用IO对象进行通信 IO
  • 树莓派软连接修改(python为例)

    树莓派软连接修改 进入linux的软连接存放位置 cd usr bin 删除原有软连接 以python为例 rm python 建立新软连接 以python连接python3为例 ln s usr python bin python3 us
  • 大数取模运算,快速幂取模运算

    1 快速幂取模 http www cnblogs com yinger archive 2011 06 08 2075043 html 快速幂取模就是在O logn 内求出a n mod b的值 算法的原理是ab mod c a mod c
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则

    微服务系列 Spring Cloud Alibaba 之 Sentinel 基本流控规则 在上一篇中 我们学习完了 Sentinel 的基本流控规则 这篇我们来研究一下 Sentinel 的高级流控规则 话不多说 开始今天的学习 一 概述
  • 【进阶项目】Lombok 使用详解

    前言 在 Java 应用程序中存在许多重复相似的 生成之后几乎不对其做更改的代码 但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求比如 在 Java 应用程序开发中 我们几乎要为所有 Bean 的成员变量添加 get set
  • 【java毕业设计】基于java+Lucene+Tomcat的搜索引擎设计与实现(毕业论文+程序源码)——搜索引擎

    基于java Lucene Tomcat的搜索引擎设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于java Lucene Tomcat的搜索引擎设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PPT模板及
  • 忽略shell脚本中回车的方法

    在实际应用过程中 经常遇到需要忽略shell脚本中回车的问题 本文做了一些总结 既有常规操作 也有令人拍案叫绝的方法 且让我慢慢说来 一 使用Linux shell自身的字符串操作 Linux shell内置了一系列的字符串操作符号 可以实
  • 高并发的epoll+多线程

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • algorithm 修改序列的操作

    文章目录 修正序列算法 fill first last val random shuffle first last partition first last pred rotate first middle last 相关参考 修正序列算法
  • logback历史日志无法自动删除的问题

    例如在logback spring xml进行如下配置