首页 > 其他分享 >logback配置日志归档和删除

logback配置日志归档和删除

时间:2024-09-29 12:50:10浏览次数:9  
标签:配置 log 清理 triggeringPolicy 文件夹 归档 日志 执行 logback

通用基本配置和说明

<!-- 定义一个名为 "RollingFile" 的 appender,用于滚动记录日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 指定日志文件的路径和文件名 -->
    <file>${log.path}/foo.log</file>
    <!-- 配置日志文件的内容编码及格式 -->
    <encoder>
        <!-- 设置每条日志输出的具体格式 -->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level  %class{36} %L - %msg%n</pattern>
        <!-- 设置日志文件的字符编码为 UTF-8 -->
        <charset>UTF-8</charset> 
    </encoder>
    <!-- 配置日志文件滚动的策略,支持基于时间和大小的滚动 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 滚动后的日志文件命名模式 -->
        <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/foo-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <!-- 单个日志文件的最大大小限制 -->
        <maxFileSize>20MB</maxFileSize>
        <!-- 保留历史日志文件的最大天数,执行删除的时候会从maxHistory天前开始 -->
        <maxHistory>7</maxHistory>
        <!-- 所有日志文件占用磁盘空间的最大容量 -->
        <totalSizeCap>10GB</totalSizeCap>
        <!-- 启动时清理不再需要的日志文件 -->
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
</appender>

注意最后一个配置项

建议是配置为true,这样每次启动就会检测是否需要清理过期的日志文件。
<cleanHistoryOnStart>true</cleanHistoryOnStart>

清理的触发时机和策略

  1. 配置了前面的启动时检查清理的属性,那么在启动时就会做一次。
  2. 每次写入log文件的时候也会检查一次。什么意思呢,就是我们在调用log.info、debug等输出内容的时候,具体的XXAppender实现会依据条件满足时,调用rollover();
    这个需要注意,下一次可用的清理时间时初始化时候就算好的,比如按天归档清理,那么这里就是下一天00:00:00,意味着什么呢,启动之后短时间内肯定不会执行清理,而是等运行到过了当天,对吧到凌晨0点之后才会触发。 那么如果你总是重启应用,然后又没配置cleanHistoryOnStart,你猜会不会给你清理,必然不会。

执行策略

依赖上面的rollingPolicy配置,其中清理会用到的属性是maxHistory:从多少天之前开始清理,比如配置为5,那就扫描是当前日期-5天的目录下的文件。totalSizeCap:大于这个总的容量,也会触发。

常见问题

  • 为什么我配置了清理,并没有清理掉文件、文件夹呢?
    首先需要明白如果没有配置每次启动都检测,那么就会依赖于执行周期,如果执行周期没有被触发就不会执行。
    另外如果文件夹、文件的名字被动过,不符合规则当然也扫描不到。
    还有一点,多个清理策略是针对rollingPolicy的,那么多个appender对应的每一个rollingPolicy中都得配置。《当然可以自定义通用策略来替换,配置一次,按需搞即可》
  • 为什么还有很久之前的文件夹放在哪里
    过了执行周期了,比如你之前并为正确配置清理,才刚配置成功。
    文件夹的删除规则是,必须是空文件夹,意味着里面的文件必须都先执行删除了才会删除文件夹(默认规则)。

代码简要说明

//程序启动加载配置后会初始化线程池
 public synchronized ScheduledExecutorService getScheduledExecutorService() {
        if (scheduledExecutorService == null) {
            scheduledExecutorService = ExecutorServiceUtil.newScheduledExecutorService();
        }
        return scheduledExecutorService;
    }
    
    //ExecutorServiceUtil.newScheduledExecutorService方法。默认线程池大小为8,名字为“logback-” 开头
    //其实最终只是创建了一个自定义线程(logback公用,不是转给清理用)名称的线程池,虽然使用的是Scheduled,使用的默认初始化是0延迟,也就是立即调用执行的)
    static public ScheduledExecutorService newScheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(CoreConstants.SCHEDULED_EXECUTOR_POOL_SIZE, THREAD_FACTORY);
    }
	
	
    //如果没有cleanHistoryOnStart就执行清理,俺么就依赖于滚动策略。
    //RollingFileAppender中的方法,注意这里的rollover()就是清理入口,前提是满足triggeringPolicy.isTriggeringEvent条件。
    //这里的triggeringPolicy就是TimeBasedRollingPolicy(依据时间滚动),currentlyActiveFile就是配置的日志文件,比如d:\logs\foo.log,event是ILoggingEvent的实现,这里默认就是LoggingEvent
    //内部先按照配置的大小、日期去比较是否要触发清理。(文件大小超过maxFileSize、或者当前日期>=下一个检查日期【默认的次略日期是按天,比如每天00点】
    /**
    * 
    * This method differentiates RollingFileAppender from its super class.
    */
    @Override
    protected void subAppend(E event) {
        // The roll-over check must precede actual writing. This is the
        // only correct behavior for time driven triggers.

        // We need to synchronize on triggeringPolicy so that only one rollover
        // occurs at a time
        synchronized (triggeringPolicy) {
            if (triggeringPolicy.isTriggeringEvent(currentlyActiveFile, event)) {
                rollover();
            }
        }

        super.subAppend(event);
    }

标签:配置,log,清理,triggeringPolicy,文件夹,归档,日志,执行,logback
From: https://www.cnblogs.com/Nuwa/p/18439453

相关文章

  • Wpf使用NLog将日志输出到LogViewer
    Wpf使用NLog将日志输出到LogViewer 1LogViewerLogViewer是通过UDP传输的高性能实时log查看器。具有一下特性:通过UDP读取日志通过文件导入日志导出日志到一个文件中排序、过滤(日志树,日志等级)和查找突出显示搜索文本从UPD接收日志时忽略IP地址列表多接收器支持多种......
  • 这些年出版的书籍——归档整理
    随着出版的书籍越来越多,收到的各种邮件也越来越频繁,遂于百忙之中,抽空整理一下书籍相关的资料和信息。《ASP.NETMVC企业级实战》出版日期:2017年3月目录:https://www.cnblogs.com/jiekzou/p/5625762.html    随书源码:因某些原因,原百度云盘下载地址已被封,qq......
  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
    SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法springboot、maven、mybatisplus、sql、日志、控制台、console、log背景在baomidou.com学习mybatisPlus入门的过程中,接触到表名和关键词冲突,加注解加表名引号后问题解决。不过我还想,在控制台打印一下执行......
  • 妙用编辑器:使用Notepad--的标记颜色功能更高效的阅读日志文件
    应用场景在日常维护工作中,经常需要查看一些日志,以判断系统的运行状态或者进行问题定位,当系统出现故障时,一般都会有特殊的关键字,但对于浩如烟海的日志来说,识别这些关键字信息还是非常费眼力的,比如有如下一段日志,尝试一眼看到关键信息:06-1013:14:11.63957849658WSystem.err......
  • ELK日志收集之ES基础概念及索引增删改查别名
    一、ES核心基本术语集群(Cluster):由一个或多个节点组成的网络,共同提供索引和搜索功能。每个集群都有一个唯一的集群ID。#查看集群名字和UUIDcurl-XGET"localhost:9200"节点(Node):构成集群的基本单元,每个节点都有一个唯一的ID,并且可以存储数据。#查看所有节点信息curl-XGET"......
  • 2024/9/27日工作日志
    复习英语单词60个;完成数据结构pta选择题,函数第一题;includeincludeincludeincludeusingnamespacestd;defineOVERFLOW-2typedefintElemType;//ElemType为可定义的数据类型,此设为int类型defineMAXSIZE100//顺序表可能达到的最大长度typedefstruct......
  • SpringBoot日志配置
    springboot默认使用logbak日志框架进行记录日志,且默认输出级别为info级别。如果要修改日志级别的话我们可以添加logbak.xml文件来进行配置,可参考如下配置:<?xmlversion="1.0"encoding="UTF-8"?><!--scan为true时,如果配置文件发生改变将会进行重新加载--><!--scanPeriod属......
  • oracle rac开启归档
    1.创建归档目录su-gridasmcmdlsdgcdframkdirarch2.修改归档路径su-oraclesqlplus/assysdfbaaltersystemsetlog_archive_dest_1='location=+fra/arch'scope=spfilesid='prod1';altersystemsetlog_archive_dest_1='location=+fra......
  • Spring Cloud全解析:服务调用之OpenFeign日志打印
    OpenFeign日志打印OpenFeign提供了日志打印功能,可以配置不同级别的日志级别publicenumLevel{//默认,不显示任何日志NONE,//仅记录请求方法、url、响应状态码及执行时间BASIC,//除记录BASIC信息外,还记录请求头和响应头HEADERS,//除了HEADERS信息外,还有请......
  • 【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
    问题现象客户刚开始使用YashanDBodbc的时候,需要查看调用日志详情,确认相应接口调用情况。问题的风险及影响客户在windowsserver2016环境测试,影响测试业务的开展。问题影响的版本YashanDB版本:所有版本问题发生原因本案例是对操作的说明,不涉及根因解决方法及规避方式1......