2013-11-24 46 views
2

我們正在使用的logback與DynamicThreshholdFilter定義如下的logback - 修改DynamicThresholdFilter(TurboFilter)編程方式在運行時

<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"> 
    <Key>USER_MDC_KEY</Key> 
    <DefaultThreshold>DEBUG</DefaultThreshold> 
    <MDCValueLevelPair> 
     <value>USER1</value> 
     <level>DEBUG</level> 
    </MDCValueLevelPair> 
</turboFilter> 

給出有沒有一種方法以編程方式修改MDCValueLevelPair的設置。例如,將USER1的級別修改爲INFO。

回答

2

它不能被修改爲動態,因爲有一個阻止它的檢查。

Iterator<TurboFilter> it = ((ch.qos.logback.classic.LoggerContext)LoggerFactory.getILoggerFactory()).getTurboFilterList().iterator(); 
while (it.hasNext()) { 
    TurboFilter f = it.next(); 
    if (f instanceof DynamicThresholdFilter) { 
    DynamicThresholdFilter dtFilter = (DynamicThresholdFilter)f; 
    MDCValueLevelPair pair = new MDCValueLevelPair(); 
    pair.setValue("USER1"); 
    pair.setLevel(Level.INFO); 
    dtFilter.addMDCValueLevelPair(pair); 
    } 
} 

如果您還沒有一個TurboFilter配置,你可以創建一個新的,並把它添加到LoggerContext

你可以,但是,動態地沿東西線設置。

+0

感謝您的輸入。由於它不能被修改,因此當我們添加另一個MDCValueLevelPair時,它是否會覆蓋較早的值 – Kaushal

+0

如果您嘗試添加具有相同值的另一個「MDCValueLevelPair」,則會出現錯誤。 –

1

我認爲您可以添加另一個MDC鍵/值對來控制日誌級別,而不是更改USER1的日誌級別。

<configuration> 
    <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"> 
    <Key>LEVEL_FOR_USER1</Key> 
    <DefaultThreshold>DEBUG</DefaultThreshold> 
    <MDCValueLevelPair> 
     <value>INFO</value> 
     <level>INFO</level> 
    </MDCValueLevelPair> 
    </turboFilter> 
    ...... 
</configuration> 
MDC.put("LEVEL_FOR_USER1", "INFO");