一、本文实际解决的问题

如何在代码中修改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. vue cli 3 打包过大问题

    vue cli 3 打包命令 npm run build,这种情况下的打包可以通过设置 vue.config.js里面的 productionSourceMap: false. 如果是自己设置的打包环 ...

  2. Swift 性能相关

    起初的疑问源自于「在 Swift 中的, Struct:Protocol 比 抽象类 好在哪里?」.但是找来找去都是 Swift 性能相关的东西.整理了点笔记,供大家可以参考一下. 一些疑问 在正题开 ...

  3. Jmeter中的参数化常用的几种方式

    Jmeter中的参数化常用的几种方式,这里讲一下前两个方式,最后一个在csv参数化里已详细讲解. 1.用户参数 2.函数助手 3.CSV Data Set Config  一.用户参数 位置:添加-前 ...

  4. cksum - 一个文件的检查和以及字节数

    SYNOPSIS(总览) ../src/cksum [OPTION]... [FILE]... DESCRIPTION(描述) 输出CRC(循环冗余校验码)检查和以及每个FILE的字节数. --hel ...

  5. vue 添加 fastclick的支持

    fastclick:处理移动端click事件300毫秒延迟 1.兼容性iOS 3及更高版本的移动SafariiOS 5及更高版本的ChromeAndroid上的Chrome(ICS)Opera Mob ...

  6. 第2节 hive基本操作:12、hive当中的hql语法

    3.2. hive查询语法 3.2.1.SELECT https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 基本 ...

  7. PHP:现有图片验证码类

    文章来源:http://www.cnblogs.com/hello-tl/p/7593022.html <?php class TL_Captcha_img{ private $image; / ...

  8. ORM之创建数据库

    ORM之创建数据库 样板:创建表名为UserInfo的表,表的主键可自行写,Django的ORM也可自行创建. from django.db import models class UserInfo( ...

  9. 分数拆分(刘汝佳紫书P183)

    枚举,由已知条件推得y大于k,小于等于2K AC代码: #include"iostream"#include"cstring"using namespace s ...

  10. 冒泡排序 and 选择排序 变量打印斐波拉契数列 and 数组打印斐波拉契数列

    1 排序 1.1 冒泡排序 #include <stdio.h> int main() { ]; printf("input six int numbers:\n"); ...