Logback和Spring Boot的新springProperty查找机制无法正常工作

Rub*_*sMN 7 java logback spring-boot

我正在使用Spring Boot 1.3.0.RC1到spring-cloud Brixton.M2​​并且无法将spring boot属性拉入logback.xml,正如此功能所暗示的那样checkin 支持springProperty的logback配置

我正在使用.yml文件,并希望从bootstrap.yml或application.yml中提取应用程序名称.

的logback-spring.xml:

<configuration>
      <springProperty scope="context" name="myappName" source="spring.application.name"/>
      <contextName>${myappName}</contextName>
      <appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>logs/${myappName}.log</file>
         ... 
      </appender>
      ...
</configuration>
Run Code Online (Sandbox Code Playgroud)

这里的文档Spring Boot Logback扩展没有多大帮助.

这个其他stackoverflow问题无法在logback.xml中使用Spring Property占位符是较旧的,也不适用于我.任何见解都会有所帮助.

每个请求,这是正在使用的相关依赖关系树

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.3.0.RC1:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.3.0.RC1:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.3.0.RC1:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.1.3:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.1.3:compile
[INFO] |  |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.12:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.12:compile
[INFO] |  |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.12:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.16:runtime
Run Code Online (Sandbox Code Playgroud)

每2条信息请求,实际发生的是logback属性myappName没有得到值.我知道的方式是该值变为"myappName_IS_UNDEFINED",我的日志文件名为"myappName_IS_UNDEFINED.log",%contextName设置为"myappName_IS_UNDEFINED".

Rub*_*sMN 8

为未来的读者提供我的分析和解决方案...我尝试了spring.application.namebootstrap.yml,然后application.yml,application.properties但没有工作.我认为这是因为我使用过logback.xml,但转换为logback-spring.xml没有变化.查看此处提交的代码,通过拉取值this.environment.getProperty(source)取决于加载属性源的时间与logback-spring.xml解释文件时的时间.不确定为什么Dave Syer能够让它工作,但是在将本地属性源添加到环境之前填充了我的.xml变量.

如果我通过SpringApplication.setDefaultProperties()设置它,则该值填充在.xml文件中.因此,这是我采取的路线.

  • 构建了一个SpringApplicationRunListener
  • SpringApplicationRunListener.started(),我读了bootstrap.yml(我需要所有框架用户的spring.application.name)new ClassPathResource("/bootstrap.yml")
  • service.log.name基于值在HashMap中设置新属性
  • SpringApplication.setDefaultProperties()用那个HashMap 调用
  • 然后我就可以${myappName}logback-spring.xml文件中使用了

我承认这不是一个完美的解决方案,但它现在可以使用,并且可能会继续用于springBoot的未来版本.我对进一步的想法持开放态度,但希望提供一种适用于具有相同经验的其他人的解决方案.


LIU*_*Hai 6

我们的解决方案是重命名logback(-spring).xml为 eglogback-delayed.xml以便在 Spring Cloud Config 之前不会被读取,然后稍后从 Cloud Config repo 中的配置文件中显式激活它,例如:

logging:
    config: classpath:logback-delayed.xml
    prop-to-fill-in-logback-delayed.xml: whatever
Run Code Online (Sandbox Code Playgroud)

在 logback-delayed.xml 中声明变量

<springProperty scope="context" name="localName" source="prop-to-fill-in-logback-delayed.xml"/>
Run Code Online (Sandbox Code Playgroud)

使用 logback-delayed.xml 中的变量

<file>${localName}.log</file>
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以简单地将其添加到您的 logback 文件中:

<property resource="application.properties" />
Run Code Online (Sandbox Code Playgroud)