Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取java代码中的Logback模式_Java_Logging_Logback - Fatal编程技术网

获取java代码中的Logback模式

获取java代码中的Logback模式,java,logging,logback,Java,Logging,Logback,我正在通过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","thisI

我正在通过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");
...

这有点难看,这可能表明我们不打算这么做,但它似乎起了作用:

// 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");
//获取一些内部上下文
ch.qos.logback.classic.Logger记录器=(ch.qos.logback.classic.Logger)
LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT\u Logger\u NAME);
//获取appender中的当前模式。
OutputStreamAppender控制台AP=
(OutputStreamAppender)logger.getAppender(“控制台”);
//现在检查模式
PatternLayoutCoder编码器=(PatternLayoutCoder)consoleapp.getEncoder();
字符串模式=编码器.getPattern();
CheckPattern和WarnifMissingVar(模式,“id”);
请注意,这假定有一个名为“console”的appender。附加器列表取决于您的配置,可以使用以下方法检索:

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

对我来说,这不起作用。我无法强制转换为OutputStreamAppender,因为检索到的记录器是我所用框架的自定义类,扩展了ch.qos.logback.core.AppenderBaseI。我使用以下导入:java.util.Iterator;ch.qos.logback.classic.encoder.patternallayoutCoder;ch.qos.logback.classic.spi.ilogingevent;ch.qos.logback.core.Appender;ch.qos.logback.core.OutputStreamAppender;那么,哪个类是您的记录器呢?线程“main”java.lang.ClassCastException中的异常:io.dropwizard.logging.AsyncAppender不能强制转换为ch.qos.logback.core.OutputStreamAppender我将控制台更改为异步控制台appender,如果我运行System.out.println(app.getName()),我会得到什么;