2014-11-06 38 views
1

我正在通過MDC插入一些變量,但是如果此變量未在logback模式中使用,我想記錄一個WARN。有誰知道如何檢索java代碼中的logback模式? STH。像這樣:在java代碼中獲取Logback模式

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.slf4j.MDC; 
... 

... 
Logger LOG = LoggerFactory.getLogger(MyTestClass.class); 
... 

MDC.put("id","thisIsATestId"); 
String pattern = LOG.getLogbackPattern(); 
checkPatternAndWarnIfMissingVar(pattern,"id"); 
... 

回答

3

這是醜了一點,這可能預示着我們不是要做到這一點,但它似乎工作:

// Get some internal contexts 
ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) 
     LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); 

// Get the current pattern in the appender. 
OutputStreamAppender<ILoggingEvent> consoleapp = 
    (OutputStreamAppender<ILoggingEvent>) logger.getAppender("console"); 

// Now check the pattern 
PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleapp.getEncoder(); 
String pattern = encoder.getPattern(); 
checkPatternAndWarnIfMissingVar(pattern,"id"); 

注意,這個假設名爲「一個appender安慰」。 appenders列表取決於你的配置,可以使用:

Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders(); 
while (it.hasNext()) { 
    Appender<ILoggingEvent> app = it.next(); 
    System.out.println(app.getName()); 
} 
+0

對我來說,這是行不通的。我無法強制轉換爲OutputStreamAppender ,因爲檢索到的記錄器是我使用的Framework的自定義類,它擴展了ch.qos.logback.core.AppenderBase user3280180 2014-11-06 10:40:15

+0

我使用以下導入:java.util.Iterator; ch.qos .logback.classic.encoder.PatternLayoutEncoder; ch.qos.logback.classic.spi.ILoggingEvent; ch.qos.logback.core.Appender; ch.qos.logback.core.OutputStreamAppender; – user3280180 2014-11-06 10:42:06

+0

究竟哪一類是你的記錄器呢? – Henrik 2014-11-06 10:51:38