2016-09-27 27 views
1

我想要配置我的log4j2.xml<Pattern/>元素的值。Log4j2:根據環境變量更改模式

名義上我們有這樣的模式:

<Console name="Console" target="SYSTEM_OUT"> 
    <PatternLayout> 
    <Pattern>%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern> 
    </PatternLayout> 
</Console> 

我們的一個代碼,用戶希望不同的模式(他們有約束「的日誌條目不能跨越多行 - 即使他們已經堆棧跟蹤」),它看起來像這樣:

<Pattern>%replace{%d %p %c{1.} [%t] %m%xEx{filters(${filters})}}{(\n|\r)+}{, }%n</Pattern> 

每個用戶都可以單獨指定自己的環境,所以我覺得這是讓他們選擇自己的模式的好方法。

我知道有可能在<Pattern/>元素specify the pattern using Environment Variables。例如:

<Pattern>%d %p %c{1.} [%t] $${env:USER} %m%n</Pattern> 

我也知道it is possible to specify a default/fallback value,像這樣:$${env:USER:-default}。這很好,因爲我希望名義模式成爲默認模式,並且不需要指定定製環境。

所以,我想這個模式:

<Pattern>$${env:LOG_SYSOUT_PATTERN:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n}</Pattern> 

我的理解是,這將允許用戶在LOG_SYSOUT_PATTERN指定一種模式,而是退回到了以往的模式,否則。

我希望我的日誌條目看起來像這樣:

2016-09-27 10:47:32,073 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms 

但它似乎已經失敗。我實際上得到的模式是這樣的:

${env:LOG_SYSOUT_PATTERN:-2016-09-27 10:47:29,642 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms 
} 

我已經描述的用例超出了log4j2的字符串插值的限制嗎?

很明顯,我可以改用環境變量來完全指向不同的log4j2.xml文件,但我更喜歡一個解決方案,它不涉及維護和部署兩個文件,以便爲一個用戶定製一個差異。

我們使用Log4j 2.5和SLF4J 1.7.16。

回答

0

你必須在模式的錯誤 嘗試

<Pattern>$${env:LOG_SYSOUT_PATTERN}:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>

+0

,我認爲這種說法是不正確。正如我的問題所解釋的,我們已經知道具有回退值的宏擴展語法爲:'$$ {env:USER:-default}',但您的建議是將後備_outside_移動括號。那肯定不會有效。事實上,我嘗試過運行你的模式。它將':-'解釋爲文字。但奇怪的是,未定義的宏並沒有得到擴展,而是逐字地打印出來: '$ {env:LOG_SYSOUT_PATTERN}: - 2016-09-27 14:45:59,425 INFO cbbaEngine [main] Sleeping AuditEngine for 1000 ms' – Birchlabs