Spring Boot 对不同日志实现的动态

logging.pattern 的本地配置文件加载,由 LoggingApplicationListener#onApplicationEnvironmentPreparedEvent 完成(将 logging 系列配置绑定到系统环境变量),由其保存了大量状态,Spring Cloud 刻意去掉了该 listener

因此 logging.pattern 是否支持远程动态更新,主要看 Spring 各日志系统的 loadDefaults 实现,目前只有 logback 支持动态变更 pattern

org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.reinitializeLoggingSystem

org.springframework.boot.logging.AbstractLoggingSystem.LoggingSystem.initialize —> 远程配置? —> 是 —> 加载远程配置

        —> 否 —> Impl.loadDefaults
org.springframework.boot.logging.logback.LogbackLoggingSystem
@Override
protected void loadDefaults(LoggingInitializationContext initializationContext,
      LogFile logFile) {
   LoggerContext context = getLoggerContext();
   stopAndReset(context);
   LogbackConfigurator configurator = new LogbackConfigurator(context);
   Environment environment = initializationContext.getEnvironment();
   context.putProperty(LoggingSystemProperties.LOG_LEVEL_PATTERN,
         environment.resolvePlaceholders(
               "${logging.pattern.level:${LOG_LEVEL_PATTERN:%5p}}"));
   context.putProperty(LoggingSystemProperties.LOG_DATEFORMAT_PATTERN,
         environment.resolvePlaceholders(
               "${logging.pattern.dateformat:${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}"));
   new DefaultLogbackConfiguration(initializationContext, logFile)
         .apply(configurator);
   context.setPackagingDataEnabled(true);
}
org.springframework.boot.logging.log4j2.Log4J2LoggingSystem
@Override
protected void loadDefaults(LoggingInitializationContext initializationContext,
      LogFile logFile) {
   if (logFile != null) {
      loadConfiguration(getPackagedConfigFile("log4j2-file.xml"), logFile);
   }
   else {
      loadConfiguration(getPackagedConfigFile("log4j2.xml"), logFile);
   }
}
org.springframework.boot.logging.java.JavaLoggingSystem
@Override
protected void loadDefaults(LoggingInitializationContext initializationContext,
      LogFile logFile) {
   if (logFile != null) {
      loadConfiguration(getPackagedConfigFile("logging-file.properties"), logFile);
   }
   else {
      loadConfiguration(getPackagedConfigFile("logging.properties"), logFile);
   }
}