【问题标题】:Controlling logback environment dependent properties in external application properties file控制外部应用程序属性文件中的 logback 环境相关属性
【发布时间】:2016-11-16 03:59:08
【问题描述】:

在我的spring-boot 应用程序中,我使用logback 进行日志记录。该应用程序使用外部application.properties 文件来设置环境特定的应用程序属性,并以选项开头:-spring.config.location=path/to/file。我希望 logback 配置也可以从那里读取属性,以便在一个地方管理所有环境属性。

我尝试了here 描述的方法,但由于属性文件不在类路径上,我收到错误:

java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.action.PropertyAction - Could not find resource [application.properties]

我有什么遗漏吗?

更新:

添加此配置有效:

   <property file="path/to/file" />

但我想避免硬编码文件路径。

【问题讨论】:

    标签: java spring spring-boot logback


    【解决方案1】:

    添加系统环境变量,所以 logback 回退到这个配置文件的位置

    logback.configurationFile=path/to/config.xml
    

    【讨论】:

    • 我的问题可能不清楚,但我希望有一个 logback 配置文件,其中包含几个不同环境的值。
    【解决方案2】:

    由于您使用的是 Spring,因此您可以为 Logback 使用 Spring 扩展:logback-ext-spring

    这个库所做的基本上是让您可以将实际日志记录委托给 Spring 托管对象,从而使您可以访问 Spring 上下文。您可以在 Spring 配置中创建和配置附加程序,您可以在其中访问 Environment 变量,因此也可以访问 application.properties。

    您可以在 GitHub 页面上找到更多信息,但这里是一个示例配置,基于链接中提供的示例,其中控制台附加程序的模式是从环境属性 "consolePattern" 中检索的:

    logback.xml:

    <configuration>
    
        <appender name="consoleAppender" class="ch.qos.logback.ext.spring.DelegatingLogbackAppender"/>
    
        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
        </root>
    
    </configuration>
    

    LogbackConfig.java:

    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.ext.spring.ApplicationContextHolder;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.env.Environment;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class LogbackConfig {
    
        @Autowired
        private Environment environment;
    
        @Bean 
        public static ApplicationContextHolder applicationContextHolder() {
            return new ApplicationContextHolder();
        }
    
        @Bean 
        public static LoggerContext loggerContext() {
            return (LoggerContext) LoggerFactory.getILoggerFactory();
        }
    
        @Bean (initMethod = "start", destroyMethod = "stop")
        public static PatternLayoutEncoder encoder (LoggerContext ctx) {
            PatternLayoutEncoder encoder = new PatternLayoutEncoder();
            encoder.setContext(ctx);
            encoder.setPattern(environment.getProperty("consolePattern");
            return encoder;
        }
    
        @Bean (initMethod = "start", destroyMethod = "stop")
        public static ConsoleAppender consoleAppender (LoggerContext ctx, PatternLayoutEncoder encoder) {
            ConsoleAppender appender = new ConsoleAppender();
            appender.setContext(ctx);
            appender.setEncoder(encoder);
            return appender;
        }
    }
    

    重要
    请注意,spring bean 名称必须与logback.xml 中的appender 名称匹配,例如"consoleAppender"。另外不要忘记指定initMethod 和destroyMethod。

    希望这可以帮助您找到不对路径进行硬编码的方法。

    【讨论】:

      【解决方案3】:

      如果您使用 spring boot 来运行您的应用程序,您可以这样做:

      logback.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <property file="${configuration.file.path}" />
          .......
      </configuration>
      

      您可以更改“configuration.file.path”,但您必须在运行应用程序后更改该名称。

      您可以像这样使用属性文件中定义的属性:

      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
          <layout class="ch.qos.logback.classic.PatternLayout">
              <Pattern>
                  %d{yyyy-MM-dd HH:mm:ss} - ${property.defined.in.property.file} - %msg%n
              </Pattern>
          </layout>
      </appender>
      
      <root level="${level.defined.in.property.file}">
          <appender-ref ref="STDOUT" />
      </root>
      

      并在执行应用时将参数添加到 VM

      -Dlogging.config=/some/path/logback.xml -Dconfiguration.file.path=/other/path/application.properties
      

      logging.config 是一个 spring-boot 配置,因此您必须保留该名称。您可以在每次执行时更改该文件,而无需更改应用中的配置。

      如果你通过命令行手动执行你的应用程序,应该是这样的:

      java -Dlogging.config=/some/path/logback.xml -Dconfiguration.file.path=/other/path/application.properties -jar app-1.0.0.jar .....
      

      这样做,所有日志记录配置都是动态的,并且您在运行应用程序时会提供它。您可以拥有具有不同配置的不同实例

      【讨论】:

        【解决方案4】:

        我们不使用spring-boot,但也许这种方法可能会有所帮助:

        我们创建了这个LogbackConfigurator。该类在应用启动时通过监听 Co​​ntextRefreshedEvent 执行:

        public class LogbackConfigurator implements ApplicationListener<ContextRefreshedEvent>
        {
            // configure your configuration file here
            private static final String         LOGBACK_CONFIGURATION   = "some/where/application.properties";
        
        
            @Override
            public void onApplicationEvent(ContextRefreshedEvent event)
            {
                LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
                try
                {
                    // creating JoranConfigurator
                    JoranConfigurator joranConfigurator = new JoranConfigurator();
        
                    // setting logger context for JoranConfiguratior
                    joranConfigurator.setContext(loggerContext);
        
                    // resetting context, override default configuration
                    loggerContext.reset(); 
        
                    // configuring Logback with resource
                    joranConfigurator.doConfigure(new Resource(LOGBACK_CONFIGURATION).getInputStream());
                }
                catch (Exception exception)
                {
                    // exception handling
                }
            }
        }
        

        为了执行 bean,我们在 Java 配置中添加了这一行:

        @Bean
        public LogbackTestConfigurator logbackConfigurator()
        {
            return new LogbackTestConfigurator();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-06
          • 1970-01-01
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          • 2020-03-06
          相关资源
          最近更新 更多