Я хотел бы иметь автоматическую конфигурацию spring, которая добавляет LogstashTcpSocketAppender.
Что я сделал:
- LogstashTcpSocketAppender был добавлен в LoggerContext из LogstashAutoConfiguration.java.
@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, поэтому я просто меняю свойство в хранилище ключей/значений, а затем Spring обновляю свой контекст)
- Он вызывает InitializeWithConventions в файле AbstractLoggingSystem.java.
- затем он вызовет loadConfiguration в LogbackLoggingSystem.java.
- затем он остановитAndReset(loggerContext). здесь он остановит все добавления и сбросит AllListeners();, что очистит все прослушиватели журнала. (поэтому я не могу снова использовать прослушиватели журнала для добавления приложений)
Есть ли правильный способ добавить Appender через автоматическую настройку Spring? Как я могу предотвратить удаление LogstashTcpSocketAppender из LoggerContext, когда Spring делает перенастройку приложения?