最近一个扯淡需求,java代码修改logback.xml的某个属性,,这里修改MaxHistory的值,,,直接上代码
package com.sinorail.web.controller.initpwd.acition;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.RollingPolicy;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.spi.AppenderAttachableImpl;
import cn.hutool.core.util.ObjectUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
@Component
public class ResetMaxHistoryAction {
public void resetMaxHistory(int maxDays) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
ch.qos.logback.classic.Logger logbackLogger = lc.getLogger("sys-user");
ch.qos.logback.classic.Logger rootLogger = lc.getLogger("root");
ArrayList<Appender> appenders = getAppenders(logbackLogger);
appenders.addAll(getAppenders(rootLogger));
appenders.forEach(appender -> {
RollingFileAppender rollingFileAppender = getRollingFileAppender(appender);
if (ObjectUtil.isNotNull(rollingFileAppender)) {
updateRollingPolicyMaxHistory(rollingFileAppender, maxDays);
}
});
}
private 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);
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;
}
}
private RollingFileAppender getRollingFileAppender(Appender appender) {
if (appender instanceof RollingFileAppender) {
return (RollingFileAppender) appender;
}
return null;
}
private RollingFileAppender updateRollingPolicyMaxHistory(RollingFileAppender rollingFileAppender, int maxDays) {
stopRollingFileAppender(rollingFileAppender);
setMaxHistyory(rollingFileAppender, maxDays);
startRollingFileAppender(rollingFileAppender);
return rollingFileAppender;
}
private void setMaxHistyory(RollingFileAppender rollingFileAppender, int maxDays) {
if (ObjectUtil.isNotNull(rollingFileAppender)) {
RollingPolicy policy = rollingFileAppender.getRollingPolicy();
TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) policy;
timeBasedRollingPolicy.setMaxHistory(maxDays);
rollingFileAppender.setRollingPolicy(timeBasedRollingPolicy);
}
}
private void stopRollingFileAppender(RollingFileAppender rollingFileAppender) {
rollingFileAppender.stop();
}
private void startRollingFileAppender(RollingFileAppender rollingFileAppender) {
rollingFileAppender.getRollingPolicy().start();
rollingFileAppender.start();
}
}
目前没有功能测试,代码没有错误,,估计这个方案我最终会舍弃掉,直接修改文件内容,,,主要是为毛要去修改人家的源代码,,,我又不是大神,,,这垃圾需求。。。。。。。