如何在代码中修改logback的rollingfileappender配置(本文代码实例为修改日志文件路径)
本文解决的问题属于一个大需求的一部分,需求为:需要特殊处理的请求的相关日志,需要与正常日志分开打印;同时不能去推动全公司应用修改代码,这样成本过高,尽量通过引入二方包解决问题
本文主要介绍获取logger之后如何修改logger配置,实现日志输出到别的路径
private static logger logger = loggerfactory.getlogger(taskhistoryservice.class);
// 获取从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; } }
public static rollingfileappender getrollingfileappender(appender appender){ if (appender instanceof rollingfileappender){ return (rollingfileappender)appender; } return null; }
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); }
如对本文有疑问, 点击进行留言回复!!
NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser androi
关于启动appium-desktop,报错:Cannot extract apk info using apkanalyzer. Falling back to aapt. Original ....
Gradle 发布共享库——如何通过Gradle发布Android依赖库(aar)到 jitpack 公共仓库
Gradle 发布共享库——如何通过Gradle发布java依赖库(jar)到 jitpack 公共仓库(—)
网友评论