2016-09-17 37 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