【发布时间】:2017-12-15 19:32:27
【问题描述】:
我正在尝试将日志记录从第 3 方应用程序(使用 JUL ConsoleHandler)发送到 logback。我已关注该网站上的所有其他帖子,但无法使其正常工作。我做错了吗?
-
我在实现捆绑激活器的 RCP 类的开头添加了以下内容
public class MyTestActivator implements BundleActivator { static { LogManager.getLogManager().reset(); SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); java.util.logging.Logger.getGlobal().setLevel(Level.FINEST); } @Override public void start(final BundleContext bundleContext) throws Exception { try { LoggerContext context = (LoggerContext) LoggerFactory. getILoggerFactory(); JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(context); try { context.reset(); configurator.doConfigure(getClass(). getResourceAsStream("/logback.xml")); } catch (JoranException e) { throw new IOException(e.getMessage(), e); } StatusPrinter.printInCaseOfErrorsOrWarnings(context); } catch (final IOException e) { e.printStackTrace(); } } } -
我的 feature.xml 文件包含:
<plugin id="jul.to.slf4j" download-size="0" install-size="0" version="0.0.0" unpack="false"/> <plugin id="ch.qos.logback.classic" download-size="0" install-size="0" version="0.0.0" unpack="false"/> <plugin id="ch.qos.logback.core" download-size="0" install-size="0" version="0.0.0" unpack="false"/> -
我的 logback.xml 包含:
<configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
更新:我也尝试了以下方法,但没有按预期工作
private static final java.util.logging.Logger[] pin;
static {
LogManager.getLogManager().reset();
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
pin = new java.util.logging.Logger[] {
java.util.logging.Logger.getLogger(""),
java.util.logging.Logger.getLogger("3rd.party.package") };
for (java.util.logging.Logger l : pin) {
l.setLevel(Level.FINEST);
for (Handler h : l.getHandlers()){
if (h instanceof ConsoleHandler){
h.setFormatter(new Formatter(){
public final String format(LogRecord record) {
if (record == null) {
return "";
} else {
return "CONSOLE_MSG:"+record.getMessage();
}
}
});
}
}
}
}
-
更新我相信我可以通过添加以下代码代替上一节中的 for 循环来实现它:
java.util.logging.Logger root = java.util.logging.Logger.getLogger(""); java.util.logging.Logger myLog = java.util.logging.Logger.getLogger("3rd.party.package"); myLog.setParent(root); myLog.setUseParentHandlers(true); java.util.logging.LogManager.getLogManager().getLogger( "" ).setLevel( Level.ALL );
唯一的缺点是我可能必须捕获每个记录器并执行此操作。当我查看调试器时,我注意到它们都没有父级(它是空的)
【问题讨论】:
-
您使用的确切 Java 版本是什么?
-
JDK 1.8.0_71、SLF4J 1.7.25、Logback 1.2.3。请参阅我对您的其他帖子的回复,了解他们如何构建 Logger 对象。