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

时间:2015-11-03 17:35:42

标签: java spring-boot logback

我正在使用Spring Boot 1.3.0.RC1到spring-cloud Brixton.M2​​,并且无法将spring boot属性拉入logback.xml,正如此功能检查Support springProperty in logback configurations

所暗示的那样

我正在使用.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>

此处的文档Spring Boot Logback extensions无济于事。

这个其他stackoverflow问题Unable to use Spring Property Placeholders in logback.xml较旧,对我来说也不起作用。任何见解都会有所帮助。

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

[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

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

10 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

我正在使用Spring Boot 1.3.1,我遇到了同样的问题。

我最终发现的是该属性必须在两个应用程序中设置。在application.yml和bootstrap.yml中。只在一个或另一个中设置它不起作用。仅将其作为-D参数传递也有效。

虽然有一个双重配置,但有点ha,特别是当它按照配置文件进行配置时。

可能两个阶段都需要回溯配置,并且属性值不会延续。

答案 2 :(得分:2)

首先,无论文件是-spring还是xml格式,您的回溯配置文件名都应以groovy为后缀。

在spring中,首选config中心,然后是命令行参数,然后是bootstrap.yml中的本地属性和所有本地属性文件。

如果多个配置文件中有许多属性,则无论它是什么值,第一个都会生效。

顺便提一下,请确保在EnvironmentPrepared事件之前没有以编程方式进行日志记录设置,导致重置日志设置。同时,如果有多个弹簧上下文,则每个上下文将重置几次logback设置。

请检查这些规则并确保每一步都在掌控之中。

答案 3 :(得分:2)

要访问spring应用程序名称,必须首先在logback-spring.xml中定义spring属性,如下所示:

<springProperty scope="context" name="MyApp" source="com.app.star"/>

因此,如果您正在访问上面的源,那么逻辑上它必须在application.yml文件中定义,如下所示:

com: app: star: HelloWorld

# Logging Configurations logging: config: "classpath:logback-spring.xml"


现在在logback-spring.xml中,appName的名称设置为“HelloWorld”,您可以使用{MyApp}进行访问。

希望上述解释有所帮助。

答案 4 :(得分:0)

如果我放了&#34; spring.application.name&#34;它对我有用。 in&#34; application.properties&#34; (不是&#34; bootstrap.properties&#34;因为日志系统是在我认为尚未提供引导属性的阶段初始化的)。我不认为logback会让你设置&#34; context&#34;命名为YMMV。

答案 5 :(得分:0)

对我来说,它只能使用命令行属性,例如--property.value = asd。

答案 6 :(得分:0)

在我仅在bootstrap.properties中更新后,它对我有用。 application.properties中的更新不起作用,也不需要。

kafka.host.name=xxxxx
kafka.host.port=9092

在Logback.xml中

<springProperty scope="context" name="kafkaHostName" source="kafka.host.name" /> 

<springProperty scope="context" name="kafkaHostPort" source="kafka.host.port" /&gt;

  <appender name="asyncXSPKafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </layout>
        </encoder>
        <topic>logstash_logs</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.RoundRobinKeyingStrategy" />
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" />
        <producerConfig>bootstrap.servers=**${kafkaHostName}:${kafkaHostPort}**</producerConfig>
        <producerConfig>retries=2</producerConfig>
    </appender>

答案 7 :(得分:0)

我们的解决方案是将logback(-spring).xml重命名为例如logback-delayed.xml以便在Spring Cloud Config之前无法读取它,然后在Cloud Config repo中的配置文件中明确地激活它,例如:

logging:
    config: classpath:logback-delayed.xml
    prop-to-fill-in-logback-delayed.xml: whatever

答案 8 :(得分:0)

您只需将其添加到您的登录文件中即可:

<property resource="application.properties" />

答案 9 :(得分:0)

我遇到了同样的问题,通过将所需的属性从application.properties移到bootstrap.properties