2013-01-11 96 views
5

我有一個正在構建的管理控制檯,並且我想爲我的應用程序顯示在Logback中創建的日誌。但是,這些日誌的存儲位置在每個環境中都不相同。我有一個定義在日誌存儲幾個屬性文件:我想找到的${log.dir}Logback's的Java API值以編程方式在Logback中定義的訪問屬性

<configuration> 
    <property resource='log.properties'/> 
    <property resource='log.${ENV:-prod}.properties'/> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.dir}/sync.log</file> 
    ... 
</configuration> 

。我試過以下,但它沒有在資源中定義的任何屬性。例如:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String logDir = loggerContext.getProperty("log.dir"); // this always returns null 

所以我的問題是我應該使用什麼API?

回答

7

默認情況下,屬性在「本地」scope中定義。但是,您可以強制屬性,使其具有上下文範圍,在這種情況下,它是很容易得到屬性的值:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty(aString); 

在「背景」的範圍被認爲是一個有點重手定義屬性。不是在上下文範圍中定義所有/許多屬性,只能在上下文範圍中定義單個屬性。這裏有一個例子:

<configuration> 
    <!-- get many props from a file --> 
    <property resource='log.properties'/> 
    <-- set only one to be in context scope --> 
    <property scope="context" name="log.dir.ctx" value="${log.dir}" /> 
    ... 
</configuration> 

然後,您可以得到您與尋找價值:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty("log.dir.ctx"); 
相關問題