我正在使用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”。
答案 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.started()
中,我通过new ClassPathResource("/bootstrap.yml")
service.log.name
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