LogBack动态添加Appender

LogBack动态添加Appender

除了在logback-spring.xml中添加Appender外,我们还可以代码处理这样的需求

一、创建LogAppenderInit,实现ApplicationRunner

package com.ypsx.cart.server.infrastructure.alert;


import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.filter.ThresholdFilter;
import com.ypshengxian.jupiter.server.appender.alert.LogAlertComponent;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.impl.StaticLoggerBinder;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 描述:添加日志告警appender
 * Created by zjw on 2022/4/19 10:16
 */
@Component
@Slf4j
public class LogAppenderInit implements ApplicationRunner {

    @Resource
    Environment environment;
    @Resource
    LogAlertComponent logAlertComponent;

    @Override
    public void run(ApplicationArguments args) {
        log.info("--- LogAppenderInit start ---");
        try {
            LoggerContext lc = (LoggerContext) StaticLoggerBinder.getSingleton().getLoggerFactory();
            LogAlertAppender la = new LogAlertAppender(environment, logAlertComponent);
            la.setContext(lc);
            la.setName("ALERT_LOG");
            la.addFilter(new ThresholdFilter());
            la.start();

            Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
            rootLogger.addAppender(la);

            log.info("--- LogAppenderInit end ---");
        } catch (Exception e) {
            log.info("--- LogAppenderInit error, eMsg:{} ---", e.getMessage());
        }
    }
}

二、Appender类继承UnsynchronizedAppenderBase

package com.ypsx.cart.server.infrastructure.alert;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import com.ypshengxian.jupiter.server.appender.alert.LogAlertComponent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;

/**
 * 描述:日志提醒Appender
 * Created by zjw on 2022/4/19 15:37
 */
@Slf4j
public class LogAlertAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

    private static final String ALERT_CONFIG = "alert_open_config";
    private final Environment environment;
    private final LogAlertComponent logAlertComponent;

    public LogAlertAppender(Environment environment, LogAlertComponent logAlertComponent) {
        this.environment = environment;
        this.logAlertComponent = logAlertComponent;
    }

    @Override
    protected void append(ILoggingEvent iLoggingEvent) {
        if (!environment.getProperty(ALERT_CONFIG, Boolean.class, false)
                || !Level.ERROR.equals(iLoggingEvent.getLevel())) {
            return;
        }

        logAlertComponent.executeLog(iLoggingEvent);
    }
}

猜你喜欢

转载自blog.csdn.net/Jarvanxy/article/details/132345522
今日推荐