【发布时间】:2020-12-22 10:29:10
【问题描述】:
我想要添加 LogstashTcpSocketAppender 的 spring 自动配置。
我做了什么:
- LogstashTcpSocketAppender 已从 LogstashAutoConfiguration.java 添加到 LoggerContext 中
@Configuration
@ConditionalOnProperty(name = "logging.logstash.url")
@RequiredArgsConstructor
public class LogstashAutoConfiguration {
@Value("${spring.application.name:null}")
private String applicationName;
@Value("${logging.logstash.url}")
private String logstashUrl;
@Bean
public LogstashTcpSocketAppender logstashAppender() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
LogstashTcpSocketAppender logstashTcpSocketAppender = new LogstashTcpSocketAppender();
logstashTcpSocketAppender.setName("LOGSTASH");
logstashTcpSocketAppender.setContext(loggerContext);
logstashTcpSocketAppender.addDestination(logstashUrl);
LogstashEncoder encoder = new LogstashEncoder();
encoder.setIncludeMdc(true);
encoder.getFieldNames().setLevelValue(null);
encoder.setCustomFields(String.format("{\"app_name\":\"%s\"}", applicationName));
logstashTcpSocketAppender.setEncoder(encoder);
logstashTcpSocketAppender.start();
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(logstashTcpSocketAppender);
return logstashTcpSocketAppender;
}
}
- 一段时间后,Spring Boot 触发事件将使应用重新配置。 (例如,我使用 Consul,所以我只需更改键/值存储中的属性,然后刷新我的上下文)
- 它调用 AbstractLoggingSystem.java 中的initializeWithConventions
- 然后它将调用 LogbackLoggingSystem.java 中的 loadConfiguration
- 然后它将停止AndReset(loggerContext)。在这里它会停止所有的 appender,它会 resetAllListeners();,这将清除所有的 logback 监听器。 (所以我不能再次使用 logback 侦听器来添加附加程序)
有没有正确的方法通过spring自动配置添加Appender? spring 重新配置应用程序时,如何防止从 LoggerContext 中删除 LogstashTcpSocketAppender?
【问题讨论】:
-
也许您可以尝试使用 DependsOn 或 Order 注释来命令创建此类配置 bean。我不知道它是否会起作用,但值得一试。查看stackoverflow.com/questions/44314418/… 和docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
-
@wakedeer 如果以下答案不起作用,请告诉我。
标签: spring spring-cloud spring-logback logstash-logback-encoder spring-autoconfiguration