如何直接使用Logback而不通过SLF4J

时间:2012-03-29 06:45:05

标签: java testing logging slf4j logback

我正在尝试调整一些logback功能(自定义Appender等)。为了测试它,我想配置Logback并直接调用它的日志记录方法而不经过sl4j。

这种奇怪要求的原因是能够在其他SLF4J网桥可用的环境中测试回溯功能。

所以我想做这里描述的内容:http://logback.qos.ch/manual/configuration.html#joranDirectly没有引用SLF4J

4 个答案:

答案 0 :(得分:3)

没试过,但看起来不对,也许会有所帮助:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
ch.qos.logback.classic.Logger log = lc.getLogger(foo.Bar.class);

ch.qos.logback.classic.Logger实施org.slf4j.Logger,但您可以直接使用它。您可能需要以不同方式获取LoggerContext

答案 1 :(得分:3)

有一种方法可以找到答案。

以下是如何配置LOGBack

的示例
// Here we create context
LoggerContext loggerContext = new LoggerContext();
// Initializer is used to enrich context with details
ContextInitializer contextInitializer = new ContextInitializer(loggerContext);
try {
    // Get a configuration file from classpath
    URL configurationUrl = Thread.currentThread().getContextClassLoader().getResource("custom-logback-configuration.xml");
    if (configurationUrl == null) {
        throw new IllegalStateException("Unable to find custom logback configuration file");
    }
    // Ask context initializer to load configuration into context
    contextInitializer.configureByResource(configurationUrl);
    // Here we get logger from context
    logger = loggerContext.getLogger(LogReporter.class);
} catch (JoranException e) {
    throw new RuntimeException("Unable to configure logger", e);
}

一般情况下,如果你想知道任何SLF4J后端是如何工作的,你可以从该后端查看org.slf4j.impl.StaticLoggerBinder类源。

答案 2 :(得分:2)

不幸的是,我认为不可能。如果您查看Logback Logger source(或其他类),您会看到它取决于slf4j。

这不好,imho,因为logback应该不知道slf4j。

答案 3 :(得分:-1)

<块引用>

我正在尝试调整一些 logback 功能(自定义 Appenders 等)。为了测试它,我想配置 Logback 并直接调用它的日志记录方法,而无需通过 sl4j。

我需要做同样的事情。在查看了 logback-classic 和 core 之后,我认为正确的答案是:

key, value = [i.strip() for i in line.split('-')]

如果您查看包含在 logback-classic 中的 // although in the slf4j package, this class is part of logback-classic ILoggerFactory factory = org.slf4j.impl.StaticLoggerBinder.getSingleton().getLoggerFactory(); ,您可以看到它调用:

StaticLoggerBinder.init()

这会找到配置文件,加载它等等。

注意:new ContextInitializer(defaultLoggerContext).autoConfig(); 也在 slf4j jar 中,因此如果您正在测试两者,则需要确保 logback 在类路径上位于 slf4j 之前。