@@@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 pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除