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);
}
}