当前位置: 移动技术网 > IT编程>开发语言>Java > 动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/RollingBackAppender

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

2019年05月20日  | 移动技术网IT编程  | 我要评论

一、本文实际解决的问题

如何在代码中修改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);
    }

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网