2014-02-25 146 views
29

我只是想知道是否有任何方法可以爲LOG4J中的屬性替換提供默認值?Log4J2屬性替換 - 默認

我想在java系統屬性中傳遞文件路徑,然後在「$ {env:mySystemProperty}」中使用它。但是如果開發者忘記設置這個屬性呢?然後我想在log4j2.xml中定義一些有意義的默認值。

任何想法如何實現這一功能?

編輯:

的ENV取代不爲我工作:

standalone.conf

-DoauthLoginLogPath=/path/oauth2.log 

log44j2.xml

<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true"> 
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true"> 

我可以看到wildfly安慰財產,我重新啓動服務器,但我無法完成它。

回答

42

默認屬性地圖

看着http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution 可以指定配置文件在默認屬性映射。這需要這種形式:

<Configuration status="debug"> 
    <Properties> 
    <Property name="oauthLoginLogPath">default/location/of/oauth2.log</Property> 
    </Properties> 
    ... 
    <Appenders> 
    <Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}"> 
    .... 
</Configuration 

然後,如果你開始系統屬性-DoauthLoginLogPath=/path/oauth2.log您的應用程序,附加器fileName值的文件將首先在系統屬性中查找,但如果失敗,就會回落到財產定義在log4j2.xml配置文件頂部的Properties部分。

在線

的第二種方式是提供默認值在線:

<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}"> 

一般來說,所有Log4j2查找遵循這個模式:${type:key:-defaultValue}

信封VS SYS

順便說一句,在env前綴是環境變量(如Windows上的%PATH%),並沒有涉及到sys,這是Java系統屬性。另請參見http://logging.apache.org/log4j/2.x/manual/lookups.html

+0

它的工作原理正是您所描述的。謝謝。 –

+0

我不知道它是否在以前的版本中工作過,但這不起作用。您必須在屬性中使用': - '來定義默認值。 – GoGoris

12

您可以使用相同的${sys:propName:-default}語法。注意': - ',它被稱爲「可變默認值分隔符」。對於「分隔符變量默認值」的默認值是:-,如慶典* nix中炮彈。

您可以在Log4j 2文檔中瞭解關於StrSubstitutor類的更多信息。

要使用相同的例子:

<Configuration status="debug"> 
    ... 
    <Appenders> 
     <Appender type="File" name="File" 
        fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}"> 
     .... 
    </Appenders> 
</Configuration> 
+0

這對我來說非常合適。 – chaitanya

+0

不幸的是,似乎在加載log4j2.xml文件時解析了默認值。無法爲例如設置默認值。通過線程上下文注入的變量。 – rec

+1

更正:有效,但必須添加第二個「$」,例如'$$ {ctx:username:-UNKNOWN}':) – rec