我正在尝试调整一些logback功能(自定义Appender等)。为了测试它,我想配置Logback并直接调用它的日志记录方法而不经过sl4j。
这种奇怪要求的原因是能够在其他SLF4J网桥可用的环境中测试回溯功能。
所以我想做这里描述的内容:http://logback.qos.ch/manual/configuration.html#joranDirectly没有引用SLF4J
答案 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 之前。