logback1.2.3版本中日志文件时间自定义

假如在logback配置文件中存在以下配置

    <appender name="custom_log_file" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${custom_log_dir}/custom_%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory><totalSizeCap>${totalSizeCap}</totalSizeCap></rollingPolicy><encoder><pattern>%msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender>

那么最终生成的日志文件名称为custom_+当前日期,但是有时候不想读取自然日期,而是业务日期(业务日期可能与自然日期存在一些出入)。那么怎么处理呢?
在TimeBasedRollingPolicy中有一个timeBasedFileNamingAndTriggeringPolicy属性。如果不配置,则取值为DefaultTimeBasedFileNamingAndTriggeringPolicy

以下源码方法为 ch.qos.logback.core.rolling.TimeBasedRollingPolicy#start

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

然后在ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy#isTriggeringEvent方法中会判断是否为触发事件。源码如下

    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;}}

覆盖该方法即可,自定一个CustomTimeBasedFileNamingAndTriggeringPolicy类覆盖时间获取逻辑。

package org.example;import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
import ch.qos.logback.core.rolling.helper.FileNamePattern;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;/*** @author: guanglai.zhou* @date: 2023/12/29 10:45*/
public class CustomTimeBasedFileNamingAndTriggeringPolicy extends DefaultTimeBasedFileNamingAndTriggeringPolicy {private static final Logger logger = LoggerFactory.getLogger(CustomTimeBasedFileNamingAndTriggeringPolicy.class);private static AtomicInteger INDEX = new AtomicInteger(0);private static String currDate = "2023-03-05";@Overridepublic boolean isTriggeringEvent(File activeFile, Object event) {List<String> dayList = Arrays.asList("2023-03-06", "2023-03-07", "2023-03-08", "2023-03-09", "2023-03-10");// 业务日期 从数据库里面查currDate = dayList.get(INDEX.getAndIncrement() % dayList.size());logger.info("从数据库获取业务日期{}", currDate);if (activeFile.getName().contains(currDate)) {return false;} else {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date parse = null;try {parse = dateFormat.parse(currDate);} catch (ParseException e) {logger.error(e.getMessage(), e);}long time = parse != null ? parse.getTime() : getCurrentTime();Date dateOfElapsedPeriod = parse != null ? parse : dateInCurrentPeriod;addInfo("Elapsed period: " + dateOfElapsedPeriod);// 通过反射获取 fileNamePatternWithoutCompSuffixtry {FileNamePattern fileNamePatternWithoutCompSuffix = (FileNamePattern) FieldUtils.readField(tbrp, "fileNamePatternWithoutCompSuffix", true);elapsedPeriodsFileName = fileNamePatternWithoutCompSuffix.convert(dateOfElapsedPeriod);System.out.println("elapsedPeriodsFileName =  " + elapsedPeriodsFileName);} catch (IllegalAccessException e) {logger.error(e.getMessage(), e);throw new RuntimeException(e);}setDateInCurrentPeriod(time);computeNextCheck();return true;}}}

再自定义一个org.example.CustomTimeBasedRollingPolicy设置上面的自定义类

package org.example;import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;/*** @author: guanglai.zhou* @date: 2023/12/29 10:54*/
public class CustomTimeBasedRollingPolicy extends TimeBasedRollingPolicy {public CustomTimeBasedRollingPolicy() {setTimeBasedFileNamingAndTriggeringPolicy(new CustomTimeBasedFileNamingAndTriggeringPolicy());}
}

最后修改logback中的相关定义即可,完整定义参考如下

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="true"><property name="custom_log_dir" value="/home/working/logs/custom"/><!-- 日志最大的历史 30天 --><property name="maxHistory" value="30"/><!-- 最大当前日志容量 --><property name="totalSizeCap" value="30GB"/><!-- 单个日志文件最大大小 --><property name="maxFileSize" value="16MB"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{18}.%M\(%F:%L\) #X# %msg%n</pattern></encoder></appender><appender name="custom_log_file" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="org.example.CustomTimeBasedRollingPolicy"><fileNamePattern>${custom_log_dir}/custom_%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>${maxHistory}</maxHistory><totalSizeCap>${totalSizeCap}</totalSizeCap></rollingPolicy><encoder><pattern>%msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><logger name="org.example" level="debug" additivity="true"/><root level="WARN"><appender-ref ref="STDOUT"/><appender-ref ref="custom_log_file"/></root></configuration>

相关依赖

   <dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><version>1.7.30</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency></dependencies>

测试案例如下,创建一个主类,多次打印日志

public static void main(String[] args) {logger1.debug("API");logger3.debug("LOG4J-1");logger3.debug("LOG4J-2");logger3.debug("LOG4J-3");logger3.debug("LOG4J-4");logger3.debug("LOG4J-5");
}

最后日志会打印到多个文件当中
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逻辑卷学习

磁盘分区的缺点 1.无法扩容 2.必须使用的空间 3.没有备份: 一、逻辑卷的定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小…

macOS编译ckb-next

macOS x86 成功&#xff0c;下一步&#xff0c;测试&#xff1a;m1、m2、m3 。 1、Homebrew # 三选一 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # /bin/bash -c "$(curl -fsSL https://raw.gith…

Android Camera相关类功能整理

1.Camera Java相关类 代码目录&#xff1a;frameworks/base/core/java/android/hardware/camera2/ CameraManager&#xff1a;camera系统服务管理类&#xff0c;用于监测、获取特征值和连接Camera设备。 CameraManager.CameraManagerGlobal:全局camera Manager实例&#xff…

Python 中的异常处理

Python 中的异常处理(Exceptions Handling in Python) 文章目录 Python 中的异常处理(Exceptions Handling in Python)Introduction 导言Python 中的异常处理结构 Exceptions Handling Structure in Python为什么我们需要 Finally 块&#xff1f; Introduction 导言 在编程过程…

PicGo+GitHub搭建免费图床

PicGoGitHub搭建免费图床 步骤 1: 安装 PicGo步骤 2:创建图床仓库步骤 3: 配置 GitHub Token步骤 4: 配置 PicGo步骤 5: 上传图片步骤 6: 访问图片 使用 GitHub 作为图床的优势在于免费、稳定且具有版本控制功能&#xff0c;特别适合个人博客、小型项目等。PicGo作为一个开源的…

Java注解之@Autowired,一文掌握@Autowired注解知识(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Linux可执行文件动态库依赖

可执行文件动态库依赖 在执行程序时&#xff0c;经常遇到 ./LinuxApp.exe: error while loading shared libraries: libmodbus.so.5: cannot open shared object file: No such file or directory 查看系统的共享库缓存&#xff0c;以确定库的安装路径 ldconfig -p 查看当前的…

JS作用域:全局作用域,函数作用域,块级作用域

JS作用域&#xff1a;全局作用域&#xff0c;函数作用域&#xff0c;块级作用域 背景作用域全局作用域函数作用域块级作用域通过调用栈分析块级作用域开发者工具查看作用域选项卡示例 背景 由于 JavaScript 存在变量提升这种特性&#xff0c;从而导致很多与直觉不符的代码&…

Springcloud Alibaba 使用Canal将MySql数据实时同步到Elasticsearch

本篇文章在Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性-CSDN博客 基础上使用canal将mysql数据实时同步到Elasticsearch。 1. 数据库准备 CREATE DATABASE /*!32312 IF NOT EXISTS*/shop /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8m…

117. 填充每个节点的下一个右侧节点指针 II

层序遍历&#xff0c;有点类似这道题。 104. 二叉树的最大深度 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node…

Spring的Bean你了解吗

Bean的配置 Spring容器支持XML(常用)和Properties两种格式的配置文件 Spring中XML配置文件的根元素是,中包含了多个子元素&#xff0c;每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中 元素包含了多个属性以及子元素&#xff0c;常用属性及子元素如下所示 i…

Raid的介绍

一、RAID的介绍 1.什么是raid "RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks”"中提出&#xff0c;当时性能最…

python可视化界面自动生成,python如何做可视化界面

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python gui可视化操作界面制作&#xff0c;python做出的炫酷的可视化&#xff0c;现在让我们一起来看看吧&#xff01; 目录 前言 一.环境配置 插件&#xff1a; 1.python 2.Chinese 3.Open In Default Browser 安装pyt…

Linux 赛题FTP配置

部署FTP站点&#xff08;匿名用户&#xff09; mkdir -p /var/ftp/文档中心 //创建目录 cd /var/ftp/文档中心 mkdir 产品技术文档 公司品牌宣传 常用软件工具 公司规章制度 chown -R ftp.ftp /var/ftp/文档中心 //修改所属主和所属组&#xff0c;避免用户无法读写目录中…

2024前端React最新面试题:React设计思想是什么?

React设计思想是什么&#xff1f; 回答思路&#xff1a;react的组件化-->react的数据驱动-->react的虚拟DOMreact的组件化数据驱动视图虚拟DOM 回答思路&#xff1a;react的组件化–>react的数据驱动–>react的虚拟DOM react的组件化 每个组件都符合开放封闭原则…

方案:智能分析网关V4区域人数超员AI算法模型的应用场景介绍

视频AI智能分析技术已经深入到人类生活的各个角落&#xff0c;与社会发展的方方面面紧密相连。从日常生活中的各种场景&#xff0c;如人脸识别、车牌识别&#xff0c;到工业生产中的安全监控&#xff0c;如工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品…

MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces(UNDO表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces&#xff08;UNDO表空间&#xff09;Undo Tablespaces&#xff08;UNDO表空间&#xff09;默认UNDO表空间添加 Undo 表空间查看Undo 相关的信息查看Undo 相关参数变量查看Undo 状态信息通过information_schema.innodb_…

python使用watchdog监听文件变化并打包成docker镜像

文章目录 简介1.监听文件的代码2.获取依赖列表文件3.创建Dockerfile文件4.上传文件到服务器上5.构建容器并启动6.更新main.py代码操作 简介 最近用python帮公司写了一个监控目录下文件发生变化的插件&#xff0c;在打包成docker镜像的过程中出现了一些小问题&#xff0c;特意记…

Unity中Shader裁剪空间推导(透视相机到裁剪空间的转化矩阵)

文章目录 前言一、简单看一下 观察空间—>裁剪空间—>屏幕空间 的转化1、观察空间&#xff08;右手坐标系、透视相机&#xff09;2、裁剪空间&#xff08;左手坐标系、且转化为了齐次坐标&#xff09;3、屏幕空间&#xff08;把裁剪坐标归一化设置&#xff09;4、从观察空…

基于YOLOv8的遥感SAR舰船小目标识别

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的遥感SAR舰船小目标&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…