2014-11-06 73 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