如何在Spring Boot项目中将application.properties的环境属性导入logback.groovy?

时间:2014-09-12 05:59:46

标签: spring groovy environment-variables logback spring-boot

尝试将application.properties/application.yml中定义的属性注入 Spring Boot 项目中的logback.groovy脚本。

我无法将EnvironmentApplicationContext注入groovy脚本。

有任何变通方法吗?

正在寻找像System.getProperty('spring.profiles.active')

这样的解决方案

的src /主/资源/ logback.groovy

import org.springframework.core.env.Environment

@Inject private Environment env; //this is not working. how to get env here?
println "spring.profiles.active : ${env.getProperty('spring.profiles.active')}"

appender("STDOUT", ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%green(%d{HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n"
    }
}

if(System.getProperty("spring.profiles.active")?.equalsIgnoreCase("prod")) {
    root INFO, ["STDOUT", "FILE"]
} else {
    root INFO, ["STDOUT"]
}

的src /主/资源/ application.yml

---
spring:
    profiles:
        active: development

2 个答案:

答案 0 :(得分:2)

需要非常早地评估

logback.groovy,否则加载spring配置,实例化bean等的代码无法记录任何内容。这就是 @Inject 无法工作的原因。

我看到两个选项:

  1. 您可以轻松地在logback.groovy中加载 application.properties ,但是将spring提供的所有配置覆盖机制考虑在内并不是一件容易的事。
  2. 创建一个可以通过programmaticaly更改logback配置的spring bean 初始化时
  3. 另一种方法是使用 -Dlogback.configurationFile = / path / to / config.groovy 将生产中的logback配置外部化。将配置文件放在一个众所周知的位置(例如 / etc / my-app )可以轻松更改生产中的日志级别,而无需重新部署(甚至重新启动)。

答案 1 :(得分:2)

很抱歉恢复这个帖子但是因为这是我在寻找解决方案时发现的线程,所以我想分享一个解决方法。

我使用了自定义转换器和转换规则来提取类路径资源中的属性(即application.properties):

在logback.groovy中:

conversionRule('springApplicationName', CustomSpringApplicationNameConverter)

def patternExpression = '%green([%d{YYYY-MM-dd HH:mm:ss.SSS}]) [%t] %highlight(%-5level) %magenta([%springApplicationName]) - %cyan(%logger{36}) -- %msg%n'

然后在所需的appender中使用'patternExpression'

和我的自定义转换器类(在groovy中):

class CustomSpringApplicationNameConverter extends ClassicConverter {

    @Override
    String convert(ILoggingEvent event) {
        ClassPathResource classPathResource = new ClassPathResource('application.properties')

        Properties applicationProperties = new Properties()
        applicationProperties.load(classPathResource.inputStream)

        String springApplicationName = applicationProperties.getProperty('spring.application.name')
        if (!springApplicationName) {
            System.err.println('Could not find entry for \'spring.application.name\' in \'application.properties\'')
        }

        springApplicationName
    }
}