Java程序运行时动态生成日志文件-loj4j

1.创建Appender;

2.logger实例和appender的绑定和解绑

    <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.17.2</version></dependency><!--这个需不需要引入看情况!--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-nop</artifactId><version>1.7.25</version></dependency>
package com.xx;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy;
import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.layout.PatternLayout;import java.util.Map;/**** log4j在程序运行时根据sessionId动态创建日志文件* <p>* .** @author little_lunatic* @date 2025-01-14*/
public class DynamicLogging {/** 获取Logger上下文 */private static final LoggerContext context = (LoggerContext) LogManager.getContext(false);/** 创建布局 */private static final PatternLayout layout = PatternLayout.newBuilder().withPattern("[#%%&*^]%d{yyyyMMddHHmmss:SSS}.%ip:%processID,%threadID#%X{TransactionID}%%%X{CID}&%X{SessionID}*%X{CWA}^%X{serialNo}:%p>[%logger{0}:%L] %X{minaSessionId}>> %msg%n").build();/** 创建TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy */private static final TimeBasedTriggeringPolicy timeBasedTriggeringPolicy = TimeBasedTriggeringPolicy.newBuilder().withInterval(1).withModulate(true).build();private static final SizeBasedTriggeringPolicy sizeBasedTriggeringPolicy = SizeBasedTriggeringPolicy.createPolicy("10MB");/**使用CompositeTriggeringPolicy组合多个触发策略 */private static final CompositeTriggeringPolicy triggeringPolicy = CompositeTriggeringPolicy.createPolicy(timeBasedTriggeringPolicy, sizeBasedTriggeringPolicy);/** 创建DefaultRolloverStrategy */private static final DefaultRolloverStrategy rolloverStrategy = DefaultRolloverStrategy.newBuilder().withMax("7").build();/*** Logger实例绑定Appender* @param logger 需要绑定Appender的Logger实例* @param sessionId 会话ID,用于区分不同的日志文件*/public static void createLoggerForSession(Logger logger, String sessionId) {// 从上下文中获取当前配置Configuration configuration = context.getConfiguration();// 读取属性String prefix = configuration.getStrSubstitutor().replace("${LOG_HOME}/${APP_NAME}.${MODULE_NAME}");// 定义日志文件名和模式
//        String fileName = prefix + ".session-" + sessionId + ".log";
//        String filePattern = prefix + ".session-" + sessionId + "_%d{yyyy-MM-dd}-%i.log.gz";String fileName = "logs/session-" + sessionId + ".log";String filePattern = "logs/session-" + sessionId + "_%d{yyyy-MM-dd}-%i.log.gz";// 避免未remove之前,多次创建相同的sessionid-appenderMap<String, Appender> appenders = logger.getAppenders();Appender appender = appenders.get(sessionId);if (appender == null) {// 创建新的RollingFileAppenderappender = RollingFileAppender.newBuilder().setName(sessionId).setLayout(layout).withFileName(fileName).withFilePattern(filePattern).withPolicy(triggeringPolicy).withStrategy(rolloverStrategy).build();// 启动Appenderappender.start();// logger绑定Appenderlogger.addAppender(appender);}}/*** Logger实例解绑Appender* 该方法用于从Logger实例中解绑特定的Appender* 主要目的是在不需要保留日志输出的会话结束时,停止与该会话关联的Appender,并从Logger中移除** @param logger Logger实例,即需要操作的日志记录器* @param sessionId 会话ID,用于标识特定的Appender*/public static void removeLoggerForSession(Logger logger, String sessionId) {// 获取Logger实例中的所有AppenderMap<String, Appender> appenderMap = logger.getAppenders();// 根据会话ID获取对应的AppenderAppender appender = appenderMap.get(sessionId);// 检查是否找到了对应的Appenderif (appender != null) {// 停止Appender,准备解绑appender.stop();// 从Logger实例中移除该Appenderlogger.removeAppender(appender);}}
}

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

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

相关文章

本次小论文minor revision中的知识积累

可以发邮件向编辑申请延期返修截止日期 https://cn.service.elsevier.com/app/answers/detail/a_id/29653/c/10595/supporthub/publishing/role/作者/ https://zhuanlan.zhihu.com/p/577324425申请邮件模板:如何在Editorial Manager系统中提交修改稿?【爱思唯尔Editorial Man…

多通道传感器接入集中控制频率温度 传感器集线器带来更多方便

多通道传感器接入集中控制频率温度 传感器集线器带来更多方便现场传感器太多,编号容易混乱?传感器集线器可以将多路传感器轮流切换到单一接口,为现场提供更多方便。操作简便直观,使用一个百位拨动开关和两个旋转开关(十位和个位)自由切换到任意传感器。 传感器通道多,最…

实战指南:优化采购流程,实现高效采购管理

优化采购流程需要从多个方面入手,包括明确采购需求、加强供商管理、优化采购谈判与合同签订、加强采购执行与跟踪、提高质量控制与验收水平、进行成本分析与优化、加强人员培训与发展以及注重合规与风险管理。通过这些措施的实施,可以显著提高采购效率和质量,降低采购成本,…

Lableview 标签软件 | LABELVIEW 条形码标签软件

Lableview 标签软件 | LABELVIEW 条形码标签软件Lableview 专业顾问 手机|微信:13928851814值得您信赖的条形码标签软件稳健可靠的条形码标签创建与集成简单的数据库连接易于使用的界面和提供便利的向导100 多种条形码符号体系可自定义的打印界面变量选用表增加了灵活性LABE…

原生JS实现一个日期选择器(DatePicker)组件

这是通过原生HTML/CSS/JavaScript完成一个日期选择器(datepicker)组件,一个纯手搓的组件的开发。主要包括datepicker静态结构的编写、日历数据的计划获取、组件的渲染以及组件事件的处理。 根据调用时的时间格式参数,可以控制短日期格式或长日期格式。实现效果(短日期格式…

LabelMatrix 标签软件 | LABEL MATRIX 条形码标签软件

LabelMatrix 标签软件 | LABEL MATRIX 条形码标签软件LabelMatrix 专业顾问 手机|微信:13928851814LABEL MATRIX 条形码标签软件 借助功能丰富的条形码标签软件,为将来的发展奠定坚实的基础适用于简单标签需求的条形码标签软件提供帮助的内置向导熟悉的 Windows 用户界面10…

《操作系统真相还原》实验记录2.5——线程实现

本文章实现内容如下: 1. 实现单线程的创建功能 2. 实现多线程调度的基本功能,包含:时钟中断处理函数;任务调度器;任务切换函数;零、项目说明本项目仓库现已公开,地址:GitHub:-HC-OS-操作系统设计项目 本项目当前进度:已完成多线程调度基础功能;一、前置知识点 1.1 …

360SafeBrowsergetpass:红队360浏览器密码抓取工具

免责声明 仅限用于技术研究和获得正式授权的攻防项目,请使用者遵守《中华人民共和国网络安全法》,切勿用于任何非法活动,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律连带责任项目介绍 红队一键辅助抓取360安全浏览器密码的CobaltStrik…

连续番茄时钟和长休息

原始时钟只支持手动25min+休息,用js增加连续自动番茄去支持Tempermonkey的浏览器的Add-ons安装 代码 https://pomodoro.pomodorotechnique.com/ 打开后刷新一次// ==UserScript== // @name Automated Pomodoro with Long Break // @namespace http://tampermonkey.…

Kernel Memory: 强大的AI驱动记忆系统

Kernel Memory简介 Kernel Memory(简称KM)是由微软开发的一个强大的多模态AI服务,专门用于高效索引和处理大规模数据集。它支持检索增强生成(RAG)、合成记忆、提示工程和自定义语义记忆处理等先进功能,为构建智能应用提供了强大的基础设施。 KM可以作为Web服务、Docker容器、C…

亚矩阵云手机:服务于未来新型电商矩阵的助力者

亚矩阵云手机是基于端云一体虚拟化技术 通过云网、安全、AI等数字化能力,弹性适配用户个性化需求,释放手机本身硬件资源,随需加载海量云上应用的手机形态 简单来说,云手机=云服务器+Android OS,用户可以远程实时控制云手机,实现安卓APP的云端运行;也可以基于云手机的基础算力,高…

0.LED基础控制

典中典之发光二极管,我从小学到大长脚是正级,断脚是负极 里面大块的是负级,小块的是正极 电阻标注:若标注102 -> 代表着为1K电阻(10^2) 若标注473 -> 代表着为47K电阻(47 * 10^3) 以此类推 其他器件标注也为类似模式RP7 RP9模块为限流电阻 此单片机使用TTL规范(高…