我开始开发一个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输出我正在使用,然后他们消失了.
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并检查它是否在那里工作.
如果你找到一个解决方案(发布它作为答案),让我们知道,我会投票;)