java代码修改logback.xml的MaxHistory值

最近一个扯淡需求,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;

/**
 * @Author wangchang
 * @Description 设置logback.xml的MaxHistory值
 * @Date 2023/9/19 16:13
 */
@Component
public class ResetMaxHistoryAction {
    /**
     * 重置入口
     *
     * @param maxDays
     */
    public void resetMaxHistory(int maxDays) {
        // 获取日志上下文
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        // 获取系统用户操作日志 的属性
        ch.qos.logback.classic.Logger logbackLogger = lc.getLogger("sys-user");
        // 获取父级为root 日志的属性
        ch.qos.logback.classic.Logger rootLogger = lc.getLogger("root");

        // 获取两种appender,并组装到list
        ArrayList<Appender> appenders = getAppenders(logbackLogger);
        appenders.addAll(getAppenders(rootLogger));

        appenders.forEach(appender -> {
            RollingFileAppender rollingFileAppender = getRollingFileAppender(appender);
            if (ObjectUtil.isNotNull(rollingFileAppender)) {
                updateRollingPolicyMaxHistory(rollingFileAppender, maxDays);
            }
        });
    }


    /**
     * 获取logger中的appenders
     *
     * @param logger
     * @return
     */
    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;
        }
    }

    /**
     * 获取RollingFileAppender
     *
     * @param appender
     * @return
     */
    private RollingFileAppender getRollingFileAppender(Appender appender) {
        if (appender instanceof RollingFileAppender) {
            return (RollingFileAppender) appender;
        }
        return null;
    }


    /**
     * 更新策略的MaxHistory
     *
     * @param rollingFileAppender
     * @param maxDays
     * @return
     */
    private RollingFileAppender updateRollingPolicyMaxHistory(RollingFileAppender rollingFileAppender, int maxDays) {
        // stop all:appender + policy
        stopRollingFileAppender(rollingFileAppender);
        // set MaxHistory
        setMaxHistyory(rollingFileAppender, maxDays);
        // start
        startRollingFileAppender(rollingFileAppender);

        return rollingFileAppender;
    }

    /**
     * 重置策略的MaxHistyory
     *
     * @param 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);
        }
    }

    /**
     * 停止appender
     *
     * @param rollingFileAppender
     */
    private void stopRollingFileAppender(RollingFileAppender rollingFileAppender) {
        rollingFileAppender.stop();
    }

    /**
     * 启动appender和策略
     *
     * @param rollingFileAppender
     */
    private void startRollingFileAppender(RollingFileAppender rollingFileAppender) {
        rollingFileAppender.getRollingPolicy().start();
        rollingFileAppender.start();
    }


}

目前没有功能测试,代码没有错误,,估计这个方案我最终会舍弃掉,直接修改文件内容,,,主要是为毛要去修改人家的源代码,,,我又不是大神,,,这垃圾需求。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王之蔑视.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值