一、本文实际解决的问题

如何在代码中修改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的更多相关文章

  1. maven 打包时动态替换properties资源文件中的配置值

    pom build节点下面添加resource配置: <resources> <resource> <directory>src/main/resources/&l ...

  2. 使用Nginx反向代理和内容替换模块实现网页内容动态替换功能

    2016年11月21日 10:30:00 xian_02 阅读数:10943   Nginx是一款轻量级高性能服务器软件,虽然轻量,但功能非常强大,可用于提供WEB服务.反向代理.负载均衡.缓存服务. ...

  3. logback.xml常用配置

    一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ...

  4. logback学习与配置使用

    Logback介绍 Logback 分为三个模块:Core.Classic 和 Access.Core模块是其他两个模块的基础. Classic模块扩展了core模块. Classic模块相当于log ...

  5. logback logback.xml常用配置详解(三)

    logback logback.xml常用配置详解 <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之 ...

  6. Logback日志基础配置以及自定义配置

    Logback日志基础配置 logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的.下面是最简单的一个配置,注意加粗的描述 <?xml version="1.0" ...

  7. SpringBoot配置(2) slf4j&logback

    SpringBoot配置(2) slf4j&logback 一.SpringBoot的日志使用 全局常规设置(格式.路径.级别) SpringBoot能自动适配所有的日志,而且底层使用slf4 ...

  8. 利用springloaded进行java class动态替换

    我们知道对于一个java文件,如Test.java,首先需要通过javac命令(javac Test.java)进行编译,生成class文件,再将class文件在jvm上进行加载运行,也就是java命 ...

  9. logback logback.xml常用配置详解(一)<configuration> and <logger>

    logback logback.xml常用配置详解(一)<configuration> and <logger> 博客分类: Log java loglogback  原创文章 ...

随机推荐

  1. core\stm32f10x.h(244): error: #67: expected a "}"

  2. Scala基础篇-02函数与代码块

    1.block 代码块也是表达式,其最终求得的值是最后一个表达式的值. {exp1;exp2} { exp1 exp2 } 2.function def funtionName(param:Param ...

  3. InChatter系统之客户端实现原理与阶段小结

    InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...

  4. Winform窗体验证登陆

    用户名,密码尽量不要在BLL,UIL判断,尽可能的在储存过程判断,通过返回的值不同,进行判断,这样提高安全性SQL Server储存过程代码: BEGINif(exists ( select User ...

  5. 表单文件上传编码方式(enctype 属性)

    enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 如下: <form action="upload.php" method="post&quo ...

  6. 如何优化LIMIT

    首先我们先创建个数据表做测试 表名 test (id(int) , name(var char) , content(text) , pid(int) ) 往里面倒几百万条数据进去做测试. 我们都知道 ...

  7. 基于ant design form的二次封装

    // standardForm.js import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; ...

  8. HTML5页面直接调用百度地图API,获取当前位置,直接导航目的地

    <!DOCTYPE html> <html lang="zh-cmn-Hans"> <meta charset="UTF-8"&g ...

  9. 算法竞赛入门经典5.2 STL初步

    1. 排序和检索,学会使用sort排序,以及low_bound函数 Raju and Meena love to play with Marbles. They have got a lot of m ...

  10. [模板] Treap

    插入x 删除x 查询排名为x的数 查询x的排名 求x的前驱.后继 //Stay foolish,stay hungry,stay young,stay simple #include<iostr ...