当前位置:  开发笔记 > 编程语言 > 正文

登录Eclipse/OSGi插件

如何解决《登录Eclipse/OSGi插件》经验,为你挑选了2个好方法。

我开始开发一个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中

我可以拿到DEBUG,或更低,级别的消息,如果我手动从提示(这是不切实际的东西,我发展)上运行的OSGi出现.此外,我不能通过各种属性文件影响任何其他类型的日志记录配置.我在这方面尝试的一切似乎都被日食环境所覆盖.

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

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



1> rcreswick..:

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的所有人的帮助和耐心:)



2> VonC..:

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

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

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

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

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

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

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有