2016-09-17 38 views
6

我正在使用spring boot项目。如何将活动弹簧配置文件注入logback

环境:

ch.qos.logback:logback-core:jar:1.1.5 
ch.qos.logback:logback-classic:jar:1.1.5 
org.springframework.boot:spring-boot-starter-logging:jar:1.3.3.RELEASE 

在我的项目我使用的是application.yml(应用dev.yml和应用production.yml)

性能由于春节的logback拉簧之前启动我无法将spring.profiles.active注入到logback.xml文件中。

这是我logback.xml文件的简化版本:

<configuration scan="true"> 

    <property name="LOG_PATH" value="/var/log/" /> 
    <property name="APP_NAME" value="xyz" /> 
    <property name="PROFILE" value="-${spring.profiles.active}" /> 
    <property name="CHARSET" value="utf-8" /> 
    <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /> 

    <appender name="APP-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 
     <encoder> 
     <charset>${CHARSET}</charset> 
     <Pattern>${PATTERN}</Pattern> 
     </encoder> 
    </appender> 

    <logger name="a.b.c" level="INFO"> 
     <appender-ref ref="APP-FILE" /> 
    </logger> 

    <root level="INFO"> 
     <appender-ref ref="APP-FILE"/> 
    </root> 

我要找的配置文件是属性spring.profiles.active

我的目标是对目录中的日志文件在/ var /日志文件XYZ-dev的XYZ生产但我得到XYZ-spring.profiles.active_IS_UNDEFINED.log,而不是当然的。

途径:

1 - 使用的组件,如:

@Component 
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> { 

// inject spring profile active into logback.xml 

} 

因为春天的logback前延春启动应用程序启动的当然不是工作。

2 - 使用上logback.xml属性这样

<file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file> 

结果是XYZ-spring.profiles.active_IS_UNDEFINED.log

+0

如果PROFILE是一个包含活动配置文件键值的属性,它应该可以工作 – davidxxx

+0

我正在寻找的PROFILE属性是** spring.profiles.active **,它在application.yml中定义或通过命令线。 – Leonel

回答

8

这有点晚,但我已经成功记录了Spring配置文件,将我的“logback.xml”文件重命名为“logback-spring.xml”,并访问了这样的配置文件(很多)简化版本

<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/> 

<appender name="GRAYLOG" class="com.github.pukkaone.gelf.logback.GelfAppender"> 

    <additionalField>environment=${ACTIVE_PROFILE}</additionalField> 

</appender> 

<root level="WARN"> 
    <appender-ref ref="GRAYLOG" /> 
</root> 

似乎 “的logback-spring.xml” 可以拿起配置文件信息。

具体的documentation is here

3

以下是我为我的项目。里面你logback.xml

<include resource="org/springframework/boot/logging/logback/defaults.xml"/> 

<property resource="application.properties"/> 

然后你可以使用它在你的application.properties文件中定义的属性。 ${MY-PROPERTY} 在我的application.properties中,我有一个日志文件名的属性。

这不适用于application.yml => YAML属性文件,因为yaml文件是在logback init之后解释的。

+0

在我的项目中,我使用了application.yml(application-dev.yml和application-production.yml)的属性......所以你有其他方法吗? – Leonel

+0

嗯,我试过了,看起来你不行。也许切换回属性文件,但要小心如果你有特殊字符(属性文件不是UTF-8友好的)http://stackoverflow.com/questions/29669049/logback-xml-is-evaluated-before-application- yml-is –

2
  • 由于您使用的是Spring Boot,因此您可以定义logging.file=blah.log。请参阅official docs
  • 或者您可以使用vanilla Logback并传递一个系统变量:-DLOG_FILE=blah.log

为什么你不应该使用配置文件:

是你想要做的不是春天型材是为创建。他们需要打开/关闭bean来激活/停用启动过程中的行为。 个人资料不建议练习一般因为你测试什么和在生产中工作是不同的(虽然有时没有其他选择)。请参阅注意事项部分the original announcement

您使用配置文件的另一个问题是可以同时激活多个配置文件。创建配置文件是为了打开/关闭小的不相关零件。例如。 spring.profiles.active=cache-off,perf-monitoring-on或类似的东西。

说了这么多,你仍然可以定义一个配置文件并在该配置文件中设置logging.file=prod.log属性。这仍然是非常不好,而不是应该如何使用配置文件,但这样更好。

+0

“不建议将配置文件练习一般,因为您测试的内容和生产中的哪些内容不同” 在引用的警告部分中,我没有以这种方式读取任何内容。 它说:而在两个配置文件之间注册的bean集可能应该更类似于不同。**我同意这一点。 一般来说,Web应用程序必须通过多个环境(开发,集成等......直到生产),并且每个环境都具有特定性(操作系统,网址,数据库等),忽略这是一种不好的做法。 – davidxxx

+0

@davidhxxx不应在配置文件中定义URL,数据库等。这些需要在JNDI或特定于应用程序的配置文件中定义为系统变量,环境变量。另外请不要只从文章中拿出一篇文章,它还说:_如果一个简单的方法可以完成工作,就不要使用配置文件_ –

+0

我不会从文章中拿出一篇文章。 **如果更简单的方法可以完成工作,则不要使用配置文件**不传递URL,数据库信息等等不应该在配置文件中。此外,你说这些信息可能在应用程序特定的配置文件中。 但是对于Spring引导,配置文件也可以与特定于应用程序的配置文件一起使用,而不是在运行时通过Property注释启动或检索服务器时加载的配置文件。配置文件不仅是Java代码。 – davidxxx