动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/RollingBackAppender
一、本文实际解决的问题
如何在代码中修改logback的RollingFileAppender配置(本文代码实例为修改日志文件路径)
二、针对的场景:
本文解决的问题属于一个大需求的一部分,需求为:需要特殊处理的请求的相关日志,需要与正常日志分开打印;同时不能去推动全公司应用修改代码,这样成本过高,尽量通过引入二方包解决问题
本文主要介绍获取Logger之后如何修改Logger配置,实现日志输出到别的路径
三、logback logger结构简述

四、实现流程
1、获取Logger
private static Logger logger = LoggerFactory.getLogger(TaskHistoryService.class);
2、获取所有Appender
// 获取从logger到RootLogger的所有appenders
public static ArrayList<Appender> getAppendersTraversal(Logger logger){
Logger parent = logger;
ArrayList<Appender> result = new ArrayList<>();
while(parent != null){
ArrayList<Appender> tempResult = getAppenders(parent);
if (tempResult != null){
result.addAll(tempResult);
}
parent = getParent(parent);
}
return result;
}
// 获取logger中的appenders
public static ArrayList<Appender> getAppenders(Logger logger){
AppenderAttachableImpl<ILoggingEvent> aai;
ArrayList<Appender> fileAppenders = new ArrayList<>();
try {
Class<?> clazz = ch.qos.logback.classic.Logger.class;
Field aaiField = clazz.getDeclaredField("aai");
aaiField.setAccessible(true);
AppenderAttachableImpl<ILoggingEvent> markedAai;
aai = (AppenderAttachableImpl<ILoggingEvent>)aaiField.get(logger);
if (aai == null){
return null;
}
Iterator<Appender<ILoggingEvent>> aaiIterator = aai.iteratorForAppenders();
while (aaiIterator.hasNext()){
Appender<ch.qos.logback.classic.spi.ILoggingEvent> appender = aaiIterator.next();
fileAppenders.add(appender);
}
return fileAppenders;
} catch (NoSuchFieldException e){
e.printStackTrace();
return fileAppenders;
} catch (IllegalAccessException e){
e.printStackTrace();
return fileAppenders;
}
}
// 获取logger的parent logger
public static Logger getParent(Logger logger) {
Class<?> clazz = ch.qos.logback.classic.Logger.class;
try {
Field parentField = clazz.getDeclaredField("parent");
parentField.setAccessible(true);
Logger parent = (Logger)parentField.get(logger);
return parent;
} catch (NoSuchFieldException e){
e.printStackTrace();
return null;
} catch (IllegalAccessException e){
e.printStackTrace();
return null;
}
}
3、获取RollingFileAppender
public static RollingFileAppender getRollingFileAppender(Appender appender){
if (appender instanceof RollingFileAppender){
return (RollingFileAppender)appender;
}
return null;
}
4、更新Policy
private static RollingFileAppender updateRollingPolicyToMark(RollingFileAppender rollingFileAppender, String newFile, String newPattern){
RollingPolicy rollingPolicy = rollingFileAppender.getRollingPolicy();
TriggeringPolicy triggeringPolicy = rollingFileAppender.getTriggeringPolicy();
RollingPolicyBase rollingPolicyBase = (RollingPolicyBase)rollingPolicy;
rollingPolicyBase.setFileNamePattern(newPattern);
// stop all:appender + policy
stopRollingFileAppender(rollingFileAppender);
// set fileName
setFileName(rollingFileAppender, newFile);
// start
startRollingFileAppender(rollingFileAppender);
return rollingFileAppender;
}
private static void stopRollingFileAppender(RollingFileAppender rollingFileAppender){
rollingFileAppender.stop();
}
private static void startRollingFileAppender(RollingFileAppender rollingFileAppender){
rollingFileAppender.getTriggeringPolicy().start();
rollingFileAppender.getRollingPolicy().start();
rollingFileAppender.start();
}
private static void setFileName(RollingFileAppender rollingFileAppender, String fileName){
RollingPolicy rollingPolicy = rollingFileAppender.getRollingPolicy();
TriggeringPolicy triggeringPolicy = rollingFileAppender.getTriggeringPolicy();
// remove policy
rollingFileAppender.setRollingPolicy(null);
rollingFileAppender.setTriggeringPolicy(null);
// set fileName
rollingFileAppender.setFile(fileName);
// set policy
rollingFileAppender.setRollingPolicy(rollingPolicy);
rollingFileAppender.setTriggeringPolicy(triggeringPolicy);
}
动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/RollingBackAppender的更多相关文章
- maven 打包时动态替换properties资源文件中的配置值
pom build节点下面添加resource配置: <resources> <resource> <directory>src/main/resources/&l ...
- 使用Nginx反向代理和内容替换模块实现网页内容动态替换功能
2016年11月21日 10:30:00 xian_02 阅读数:10943 Nginx是一款轻量级高性能服务器软件,虽然轻量,但功能非常强大,可用于提供WEB服务.反向代理.负载均衡.缓存服务. ...
- logback.xml常用配置
一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ...
- logback学习与配置使用
Logback介绍 Logback 分为三个模块:Core.Classic 和 Access.Core模块是其他两个模块的基础. Classic模块扩展了core模块. Classic模块相当于log ...
- logback logback.xml常用配置详解(三)
logback logback.xml常用配置详解 <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之 ...
- Logback日志基础配置以及自定义配置
Logback日志基础配置 logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的.下面是最简单的一个配置,注意加粗的描述 <?xml version="1.0" ...
- SpringBoot配置(2) slf4j&logback
SpringBoot配置(2) slf4j&logback 一.SpringBoot的日志使用 全局常规设置(格式.路径.级别) SpringBoot能自动适配所有的日志,而且底层使用slf4 ...
- 利用springloaded进行java class动态替换
我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命 ...
- logback logback.xml常用配置详解(一)<configuration> and <logger>
logback logback.xml常用配置详解(一)<configuration> and <logger> 博客分类: Log java loglogback 原创文章 ...
随机推荐
- core\stm32f10x.h(244): error: #67: expected a "}"
- Scala基础篇-02函数与代码块
1.block 代码块也是表达式,其最终求得的值是最后一个表达式的值. {exp1;exp2} { exp1 exp2 } 2.function def funtionName(param:Param ...
- InChatter系统之客户端实现原理与阶段小结
InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...
- Winform窗体验证登陆
用户名,密码尽量不要在BLL,UIL判断,尽可能的在储存过程判断,通过返回的值不同,进行判断,这样提高安全性SQL Server储存过程代码: BEGINif(exists ( select User ...
- 表单文件上传编码方式(enctype 属性)
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 如下: <form action="upload.php" method="post&quo ...
- 如何优化LIMIT
首先我们先创建个数据表做测试 表名 test (id(int) , name(var char) , content(text) , pid(int) ) 往里面倒几百万条数据进去做测试. 我们都知道 ...
- 基于ant design form的二次封装
// standardForm.js import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; ...
- HTML5页面直接调用百度地图API,获取当前位置,直接导航目的地
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <meta charset="UTF-8"&g ...
- 算法竞赛入门经典5.2 STL初步
1. 排序和检索,学会使用sort排序,以及low_bound函数 Raju and Meena love to play with Marbles. They have got a lot of m ...
- [模板] Treap
插入x 删除x 查询排名为x的数 查询x的排名 求x的前驱.后继 //Stay foolish,stay hungry,stay young,stay simple #include<iostr ...