登录 Eclipse/OSGi 插件

2022-09-02 00:58:19

我开始开发一个Eclipse插件(从技术上讲,一个OSGi插件),我遇到的第一个问题是,我似乎无法像往常一样控制公共日志记录输出。

我已经在插件依赖项中包含了 commons-logging 包,事实上,当我记录某些内容(在 INFO 或更高的严重性下)时,它会记录到控制台。但是,我似乎无法在任何较低级别(例如DEBUG或TRACE)进行日志记录。

我已经指定了一个log4j.properties文件,它位于类路径上(对于运行时,就像共享资源日志记录包一样),但是该属性文件中的任何设置都不会对记录器的行为产生任何影响。

下面是 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

更新:

我现在已经尝试了以下各种组合:

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

我还尝试将上述库的各种配置文件放在许多地方,包括作为插件片段附加到它们各自的库,如这里所建议的那样,仍然会发生相同的结果。

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


答案 1

3天后...

我发现了问题!我需要做两件事,首先,一个清单有问题。MF 文件:

我在清单中有以下内容。一个捆绑包的 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“一起工作”。罐子确实有效,某种程度上。它显然找到了一些eclipse级别的log4j配置,并利用了它。由于它只是一个jar(不是捆绑包),它没有使用任何可以指定自定义日志记录配置的片段,这导致我们不得不发生的另一件事:

我需要设置一个捆绑包片段来指定日志记录配置。VonC这个链接给了我这样做的信息。这需要做很多事情,不幸的是,带有不正确清单的软件包。MF 仍然在 Bundle-ClassPath 中指定了 log4j jar,这似乎覆盖了 Import-Package 列表。

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

非常感谢Eclipse ZoneVonCEkkes以及freenode上#eclipse的每个人,感谢他们的帮助和耐心:)


答案 2

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

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

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

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

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

如果您找到解决方案,请使用知道(将其发布为答案),我会将其投票;)


推荐