动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/Rol...

一、本文实际解决的问题

如何在代码中修改logback的RollingFileAppender配置(本文代码实例为修改日志文件路径)

二、针对的场景:

本文解决的问题属于一个大需求的一部分,需求为:需要特殊处理的请求的相关日志,需要与正常日志分开打印;同时不能去推动全公司应用修改代码,这样成本过高,尽量通过引入二方包解决问题

本文主要介绍获取Logger之后如何修改Logger配置,实现日志输出到别的路径

三、logback logger结构简述

1196167-20190519202522943-487545794.png

四、实现流程

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);
    }

转载于:https://www.cnblogs.com/blaketairan/p/10890520.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_info] - openFile(/home/ruoyi/logs/sys-info.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-info.log (No such file or directory) ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error] - Failed to create parent directories for [/home/ruoyi/logs/sys-error.log] ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error] - openFile(/home/ruoyi/logs/sys-error.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-error.log (No such file or directory) ERROR in ch.qos.logback.core.rolling.RollingFileAppender[sys-user] - Failed to create parent directories for [/home/ruoyi/logs/sys-user.log] ERROR in ch.qos.logback.core.rolling.RollingFileAppender[sys-user] - openFile(/home/ruoyi/logs/sys-user.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-user.log (No such file or directory) at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:179) at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:232) at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:73) at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60) at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:132) at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313) ... 26 more
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值