动态替换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 原创文章 ...
随机推荐
- 微信小程序之多行文本省略号
最近在捣鼓小程序,期间遇到的问题,踩过的坑,也是在网上各种搜.这里也说下我解决的问题,方便大家. 在小程序首页显示文本列表的时候,为了美观,不希望把所有的文本都显示出来,希望是显示前几行(比如前3行, ...
- 【Python】高级函数
1.Filter函数 def is_odd(x): return x % 2 == 1 #将列表中所有的奇数筛选出来 print(list(filter(is_odd,[1,2,3,4,5,6,7]) ...
- 手动将Excel数据导入SQL
1. 右键点击数据库名称,Tasks --> Import Data... 2. Choose Data Source:MicroSoft Excel,选择Excel文件和Excel版本.Exc ...
- JVM最多能创建多少个线程: unable to create new native thread
转载自:http://www.rigongyizu.com/jvm-max-threads/ 有应用报出这样的异常“java.lang.OutOfMemoryError: unable to crea ...
- 关于Qt模态框总汇
转载请注明出处:http://www.cnblogs.com/dachen408/p/7285710.html 父窗体为QMainWindow: 当子窗体为: 1.QWidget,需要设置 this- ...
- CREATE VIEW - 定义一个视图
SYNOPSIS CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query DESCRIPTION 描述 CREATE ...
- 开放API接口
[开放API]——知乎.博客园等开放API接口(更新ing) Cnodejs.org: https://cnodejs.org/api/ 和风天气: http://docs.heweather.c ...
- Handler和内部类的正确用法
PS:本文摘抄自<Android高级进阶>,仅供学习使用 Android代码中涉及线程间通信的地方经常会使用Handler,典型的代码结构如下. public class HandlerA ...
- oracle分配权限 学习笔记--转载
在全局数据库ORCL下创建一个用户首先在开始-->运行——>sqlplus,然后输入 sys/change_on_install as sysdba 以sys权限登陆进去 然后可以进行操作 ...
- 在你的Android手机上运行Linux
之前试过许多方法(也就几种),像什么Complete Linux Installer,Debian noroot,利用已有的Linux构造Bootstrap之类,要么就是复杂得要命(调了两天没有调出来 ...