java – 登录Eclipse/OSGi插件

我开始开发一个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=%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
> Commons-logging
> java.util.logging

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

我也尝试过将各种配置文件放在上面的库中,包括作为附件到各自的库中的插件片段,如建议here,并且仍然会发生相同的结果。

我已经实现了一个自定义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),它没有使用可以指定自定义日志记录配置的任何片段,这导致我们必须发生的其他事情:

我需要设置一个bundle片段来指定日志记录配置。 This linkVonC给了我这样做的信息。这需要做一些事情,不幸的是,包含错误的MANIFEST.MF的包仍然在Bundle-ClassPath中指定了log4j jar,并且似乎覆盖了Import-Package列表。

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

我非常感谢Eclipse ZoneVonCEkkes的大部分作者,freenode中#eclipse中的每个人的帮助和耐心:)

http://stackoverflow.com/questions/223875/logging-in-eclipse-osgi-plugins

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 登录Eclipse/OSGi插件