@@@logback 指定每隔一段时间创建一个日志文件(五)

2024-02-11 19:32

本文主要是介绍@@@logback 指定每隔一段时间创建一个日志文件(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我使用的logback版本是1.2.3

目前logback支持根据时间来配置产生日志文件,但是只支持每周,每天,每个小时,每分钟等创建一个文件,配置如下:

复制代码

<appender name="SYSTEM"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.home}/system.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- daily rollover ,每天生成一份日志文件--><fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n</pattern></encoder></appender>

复制代码

但是需求是无法想象的,像突然又要求每隔一段时间之后生成一个配置文件,比如logback每隔10分钟生成一个日志文件,或每隔30分钟生成一份日志文件,每隔2个小时生成一个日志配置文件等。

下面以每隔10分钟生成一个日志文件,首先看一个每分钟生成一个配置文件 的配置

复制代码

<appender name="SYSTEM"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.home}/system.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- daily rollover ,每天分钟生成一份日志文件--><fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd-HH-mm}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n</pattern></encoder></appender>

复制代码

但是发现在配置中,没有指定每隔多长时间来生成一个配置文件,没办法,只能看源码,加百度了。首先看配置里面的

<rollingPolicy  class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
TimeBasedRollingPolicy 这个类就是日志文件生成的策略类,看它的源码

再看这个timeBasedFileNamingAndTriggeringPolicy触发策略,在ch.qos.logback.core.rolling.TimeBasedRollingPolicy类的start方法中有这样一段代码

        if (timeBasedFileNamingAndTriggeringPolicy == null) {timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();}

这说明timeBasedFileNamingAndTriggeringPolicy是可以被外部设置的,如果没有设置刚使用默认的实现。我们再看DefaultTimeBasedFileNamingAndTriggeringPolicy,这里面的判断是否触发 写日志的方法:

复制代码

 public boolean isTriggeringEvent(File activeFile, final E event) {long time = getCurrentTime();if (time >= nextCheck) {Date dateOfElapsedPeriod = dateInCurrentPeriod;addInfo("Elapsed period: " + dateOfElapsedPeriod);elapsedPeriodsFileName = tbrp.fileNamePatternWithoutCompSuffix.convert(dateOfElapsedPeriod);setDateInCurrentPeriod(time);computeNextCheck();return true;} else {return false;}}

复制代码

这里面有一个比较即time> nextCheck,如果当前时间大于下一个判断时间,则触 发生成日志,这里面有一个计算NextCheck时间的方法:computeNextCheck();

    protected void computeNextCheck() {nextCheck = rc.getNextTriggeringDate(dateInCurrentPeriod).getTime();}

再看这个方法:rc.getNextTriggeringDate,根据它最终可以找到:

复制代码

 public Date getEndOfNextNthPeriod(Date now, int periods) {return innerGetEndOfNextNthPeriod(this, this.periodicityType, now, periods);}public Date getNextTriggeringDate(Date now) {return getEndOfNextNthPeriod(now, 1);}

复制代码

它最终还是调用的 public Date getEndOfNextNthPeriod(Date now, int periods)方法,我们可以看到之前说的每小时,每分钟,都是这里调用的是

getEndOfNextNthPeriod(now, 1); 如果我们想实现每2小时,每10分钟的话,只需要调用
getEndOfNextNthPeriod(now, 2); 或getEndOfNextNthPeriod(now, 10);至于是小时还是分钟,是由这个innerGetEndOfNextNthPeriod方法时里面判断的,是根据你的配置文件生成的PeriodicityType决定的。那我们要实现自己的每隔n段时间之后生成一个配置文件,只需要实现一个自己的类即可

复制代码

package com.common.log;import ch.qos.logback.core.joran.spi.NoAutoStart;
import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;@NoAutoStart
public class MyTimeBasedFileNamingAndTriggeringPolicy<E> extends DefaultTimeBasedFileNamingAndTriggeringPolicy<E> {//这个用来指定时间间隔 private Integer multiple = 1;@Overrideprotected void computeNextCheck() {nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime();}public Integer getMultiple() {return multiple;}public void setMultiple(Integer multiple) {if (multiple > 1) {this.multiple = multiple;}}
}

复制代码

对应的配置如下:

复制代码

<appender name="SYSTEM"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.home}/system.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- daily rollover ,每天分钟生成一份日志文件--><fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd-HH-mm}.log</fileNamePattern>

              <timeBasedFileNamingAndTriggeringPolicy

               class="com.common.log.MyTimeBasedFileNamingAndTriggeringPolicy">

               <multiple>10</multiple>

                </timeBasedFileNamingAndTriggeringPolicy>

            <maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n</pattern></encoder></appender>

复制代码

这篇关于@@@logback 指定每隔一段时间创建一个日志文件(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700637

相关文章

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC