2015-11-03 2721 views
3

我通过spring-cloud Brixton.M2​​使用Spring Boot 1.3.0.RC1,并且无法将此弹簧启动属性拖入logback.xml,如此功能所示Support springProperty in logback configurationsLogback和Spring Boot的新springProperty查找机制不起作用

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

每对信息第二请求相关的依赖关系树,什么是真正回事是的logback财产myappName没有得到一个值。我知道这一点的方式是将值变为“myappName_IS_UNDEFINED”,并将我的日志文件命名为“myappName_IS_UNDEFINED.log”,将%contextName设置为“myappName_IS_UNDEFINED”。

+0

你需要至少包括你的构建控制文件(Maven或Gradle)。 – chrylis

回答

4

要提供我的分析以及对未来读者的解决方案...我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(),我在读bootstrap.yml通过new ClassPathResource("/bootstrap.yml")
  • (其中我要求所有框架用户spring.application.name)设置基于一个新的属性,service.log.name一个HashMap关闭值
  • 调用SpringApplication.setDefaultProperties()与HashMap的
  • 然后我就能够在logback-spring.xml文件中使用${myappName}

我承认这不是一个完美的解决方案,但是现在可以使用,并且可能会继续为springBoot的未来版本工作。我愿意接受进一步的创意,但希望提供一种适用于具有相同经验的其他人的解决方案。

+0

因为春天还没有让环境做好准备还为时尚早。 –

+0

如果你加载你自己的属性,为什么你不把它添加到'--property = value'形式的参数?这应该priorer然后默认属性来源和简单。 –

0

如果我将“spring.application.name”放在“application.properties”(不是“bootstrap.properties”,因为日志系统在引导属性尚不可用的阶段初始化,相信)。我不认为logback会让你设置“context”的名字,但是YMMV。

+0

仍然不适合我。使用spring-boot 1.3.0.RC1和logback 1.1.3。尝试/资源和根目录中的application.properties。如果我使用这个''来做直接的logback属性, contextName设置不会工作一半,我不断收到(http://jira.qos.ch/browse/LOGBACK-801)问题。所以仍然有点可疑。 – RubesMN

+0

也许你可以更新你的问题,更详细地了解实际发生了什么问题? –

+0

如果我把值放在“application.properties”中,而不是“application.yml”,它对我有用。 yaml文件是否在稍后的时间点处理过属性文件?我使用的是1.3.8的spring-boot。 –

2

我在Spring Boot 1.3.1上,我面临同样的问题。

我终于发现,该属性必须在application.yml和bootstrap.yml中设置。只在一个或另一个设置它不起作用。仅将它作为-D参数传递也是可行的。

尽管有一个双重配置,但是它也有一点吸引人,特别是当它按配置文件进行配置时。

也许在两个阶段都需要logback配置,并且属性值不会结转。

2

首先,您的logback配置文件名应加后缀-spring,无论文件是xml还是groovy格式。

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

如果在多个配置文件中有很多属性,第一个会影响它的值。

顺便说一句,请确保在EnvironmentPrepared事件之前没有以编程方式登录的设置导致logback设置将被重置。同时,如果存在多个弹出上下文,则对于每个上下文,logback设置将被重置几次。

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

0

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

1

为了访问弹簧应用名称,必须首先定义在的logback-spring.xml弹簧特性,如下所示:

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

所以如果访问上述然后逻辑源它

com: app: star: HelloWorld

# Logging Configurations logging: config: "classpath:logback-spring.xml"
:必须如下面application.yml文件中定义
现在在logback-spring.xml中,appName将被设置为'HelloWorld',您可以通过{MyApp}访问该名称。

希望上面的解释会有所帮助。

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" />

<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> 
0

我们的解决方案是重命名logback(-spring).xml到例如logback-delayed.xml所以它不会春季云配置前阅读,然后将其激活后明确地从云配置回购的配置文件,如:

logging: 
    config: classpath:logback-delayed.xml 
    prop-to-fill-in-logback-delayed.xml: whatever 
相关问题