在Java代码中获取Logback模式

4

我正在通过MDC插入一些变量,但如果这个变量在logback模式中没有使用,我想记录一个警告日志。有人知道如何在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");
...
2个回答

5

这看起来有点丑陋,可能暗示着我们不应该这样做,但它似乎可以工作:

// 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");

请注意,这里假设存在一个名为“console”的appender。可用的appender列表取决于您的配置,并且可以使用以下方法检索:
Iterator<Appender<ILoggingEvent>> it = logger.iteratorForAppenders();
while (it.hasNext()) {
    Appender<ILoggingEvent> app = it.next();
    System.out.println( app.getName() );
}

对我来说,这行代码不起作用。我无法将其转换为OutputStreamAppender<ILoggingEvent>,因为检索到的记录器是我使用的框架扩展的自定义类,它继承了ch.qos.logback.core.AppenderBase<ILoggingEvent>。 - user3280180
我使用以下导入: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
你的日志记录器是哪个类? - Henrik Aasted Sørensen
主线程中的异常: java.lang.ClassCastException: io.dropwizard.logging.AsyncAppender 无法转换为 ch.qos.logback.core.OutputStreamAppender - user3280180
我将控制台更改为异步控制台附加器,如果我运行System.out.println(app.getName())会得到什么? - user3280180

0

更新 Henrik 的回答,我按照以下方式使其工作:

import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.core.OutputStreamAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;

private String getPattern() {
    Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);

    OutputStreamAppender<ILoggingEvent> consoleAppender =
            (OutputStreamAppender<ILoggingEvent>) logger.getAppender("CONSOLE");

    PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleAppender.getEncoder();
    return encoder.getPattern();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接