登录 Eclipse/OSGi 插件
Posted
技术标签:
【中文标题】登录 Eclipse/OSGi 插件【英文标题】:Logging in Eclipse/OSGi plugins 【发布时间】:2010-09-18 10:36:10 【问题描述】:我开始开发一个 Eclipse 插件(从技术上讲,是一个 OSGi 插件),我遇到的第一个问题是我似乎无法像往常一样控制公共日志记录输出。
我在插件依赖项中包含了 commons-logging 包,事实上,当我记录某些内容(在 INFO 或更高严重性)时,它会记录到控制台。但是,我似乎无法在任何较低级别(例如 DEBUG 或 TRACE)登录。
我指定了一个 log4j.properties 文件,它位于类路径中(对于运行时,就像 commons-logging 包一样),但该属性文件中的任何设置都不会影响记录器的行为.
这是 log4j.properties 文件:
# Log4j Logging levels, in order of decreasing importance are:
# FATAL, ERROR, WARN, INFO, DEBUG, TRACE
#
# Root logger option
log4j.rootLogger=ERROR,stdout
#,LOGFILE
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%dABSOLUTE %5p %r (%l) %t%n - %m%n
我需要做什么才能真正控制记录器的输出?
以下是一些示例输出消息,希望格式可能与 java.util.logging 的默认值一致,或向某人提供其他提示:
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
SEVERE: fatal_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
WARNING: warn_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
INFO: info_message
更新:
我现在尝试了以下各种组合:
org.osgi.service.log.LogService 等。 slf4j Log4J Commons-logging java.util.logging如果我在提示符下手动运行 OSGi(这对于我正在开发的东西是不切实际的),我可以仅显示 DEBUG 或更低级别的消息。此外,我无法通过各种属性文件影响任何其他类型的日志记录配置。我在这方面尝试的一切似乎都被 eclipse 设置覆盖了。
我还尝试将上述库的各种配置文件放在许多地方,包括按照建议 here 将插件片段附加到各自的库中,但仍然会发生相同的结果。
我已经实现了一个自定义 LogListener,并使用 System.out.println 跟踪了日志消息的整个路径(以及我知道的方法),并且调试消息 正确显示直到它们被我使用的任何底层日志 API 输出,然后它们消失。
【问题讨论】:
【参考方案1】:这不是您问题的实际答案,但您可能会在此set of articles by ekke 中找到一些线索。
我想你已经读过“Using Log4J in Eclipse Equinox/OSGi”:
您是否在控制台模式下启动了 osgi 会话?
java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean
这样,您可以在纯 osgi 环境中测试 log4j 并检查它是否在那里工作。
如果您找到解决方案,请告诉使用(将其作为答案发布),我会投票;)
【讨论】:
【参考方案2】:3 天后...
我发现了问题!我需要做两件事,首先,一个 MANIFEST.MF 文件有问题:
我在一个捆绑包的 MANIFEST.MF 中有以下内容:
Bundle-ClassPath: lib/jena.jar,
.,
org.apache.log4j-1.2.12.jar,
lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
com.acme.translation.interfaces,
com.acme.shared.osgi,
com.acme.utilities
应该是这样的:
Bundle-ClassPath: lib/jena.jar,
.,
lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
com.acme.client.translation.interfaces,
com.acme.shared.osgi,
com.acme.utilities,
org.apache.log4j
主要区别在于 log4j 被用作一个包,而它应该被用作一个包。 (当我期望 Log4j 与 OSGi 一起“正常工作”时,我的 lib 目录中有一个 log4j jar。) jar 确实 工作,有点。它显然找到了一些 eclipse 级别的 log4j 配置,并利用了它。由于它只是一个 jar(不是包),它没有使用任何可以指定自定义日志配置的片段,这导致我们不得不发生另一件事:
我需要设置一个包片段来指定日志配置。来自VonC 的This link 给了我这样做的信息。这需要做很多事情,不幸的是,带有不正确 MANIFEST.MF 的包仍然在 Bundle-ClassPath 中指定了 log4j jar,这似乎覆盖了 Import-Package 列表。
当我需要登录另一个捆绑包时,我终于弄清楚了发生了什么(我刚刚放弃,并回到使用警告级别和更高级别的日志。)这个新捆绑包找不到日志配置! (所以我在同一个 OSGi 环境中运行了三个包,每个包都有不同的 log4j 行为——一个使用我的片段设置,另一个使用一些随机 Eclipse 日志记录设置,最后是没有任何日志记录配置的新包。)这三个bundle的详细对比发现了Manifest.MF文件的不同,现在都使用了fragment bundle。
我非常感谢Eclipse Zone、VonC、Ekkes 的大部分作者以及 freenode 上#eclipse 中的每个人的帮助和耐心:)
【讨论】:
@rcreswick 你能告诉我你把log4j.properties文件放在插件的什么地方 >3 天后.. 28 周后:Eclipse RCP 不适合创建桌面应用程序以上是关于登录 Eclipse/OSGi 插件的主要内容,如果未能解决你的问题,请参考以下文章
OSGI - 如何解决:ClassNotFoundException? (org.eclipse.osgi.internal.loader.BundleLoader.findClass)
摆脱无法转换为 String 的 org.eclipse.osgi.internal.framework.EquinoxConfiguration$1