登录Eclipse / OSGi插件

我开始开发一个Eclipse插件(技术上来说,一个OSGi插件),我遇到的第一个问题之一就是我似乎无法像往常一样控制commons-logging输出。

我在插件依赖项中包含了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=%d{ABSOLUTE} %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的
  • 共享记录
  • java.util.logging中

如果我从提示中手动运行OSGi,那么我只能显示DEBUG或更低级别的消息(这对于我正在开发的内容来说是不切实际的)。 此外,我不能通过各种属性文件影响任何其他类型的日志记录配置。 我在这方面尝试的一切似乎都被日食环境所覆盖。

我也试过在很多地方为上面的库放置各种配置文件,包括像这里建议的那样附加到各自库的插件片段,但仍然会发生相同的结果。

我已经实现了一个自定义LogListener,并使用System.out.println跟踪日志消息的整个路径(以及我知道如何),并且调试消息一直存在,直到它们被任何底层日志记录API输出我正在使用,然后他们消失了。

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被用作包,当它应该被用作包时。 (我的lib目录中有一个log4j jar,从我预期Log4j到OSGi“正常工作”时。)jar 确实有效。 它显然发现了一些eclipse级别的log4j配置,并利用了它。 由于它只是一个jar(不是一个包),它没有使用任何可以指定自定义日志记录配置的片段,这导致我们必须发生的另一件事:

我需要设置一个bundle片段来指定日志配置。 来自VonC的 这个链接给了我这样做的信息。 这需要做很多事情,遗憾的是,包含不正确的MANIFEST.MF的包仍然在Bundle-ClassPath中指定了log4j jar,这似乎覆盖了Import-Package列表。

我终于弄清楚当我需要登录另一个捆绑包时发生了什么(我刚刚放弃了,并且回到了使用Warn级别和更高级别的日志。)这个新捆绑包找不到记录配置! (所以我在同一个OSGi环境中运行了三个bundle,每个都有不同的log4j行为 – 一个使用我的片段设置,另一个使用一些随机的Eclipse日志设置,最后是没有任何日志配置的新bundle。)这三个包的详细比较揭示了Manifest.MF文件的不同之处,现在它们都使用了片段包。

非常感谢Eclipse Zone , VonC , Ekkes以及freenode #eclipse中的所有人的帮助和耐心:)

这不是您问题的实际答案,但您可能会在ekke的这组文章中找到一些线索。

我想你已经读过“ 在Eclipse Equinox / OSGi中使用Log4J ”:

你是否在控制台模式下启动了osgi会话?

 java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean 

这样,您可以在纯osgi环境中测试log4j并检查它是否在那里工作。

如果你找到一个解决方案(发布它作为答案),让我们知道,我会投票;)