【问题标题】:Get Logback pattern inside java code在 java 代码中获取 Logback 模式
【发布时间】:2014-11-06 08:34:23
【问题描述】:

我正在通过 MDC 插入一些 var,但如果此 var 未在 logback 模式中使用,我想记录一个 WARN。有谁知道如何在 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");
...

【问题讨论】:

    标签: java logging logback


    【解决方案1】:

    这有点难看,这可能表明我们不打算这样做,但它似乎有效:

    // 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”的附加程序。附加程序列表取决于您的配置,可以使用以下方式检索:

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

    【讨论】:

    • 对我来说,这不起作用。我无法转换为 OutputStreamAppender 因为检索到的记录器是我使用的框架的自定义类扩展 ch.qos.logback.core.AppenderBase
    • 我使用以下导入: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;
    • 那么你的记录器到底是哪个类?
    • 线程“main”java.lang.ClassCastException 中的异常:io.dropwizard.logging.AsyncAppender 无法转换为 ch.qos.logback.core.OutputStreamAppender
    • 我将控制台更改为 async-console-appender,如果我运行 System.out.println(app.getName());
    【解决方案2】:

    更新 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2020-12-29
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多