【问题标题】:How handle different logging solutions in OSGi (Apache Felix)如何在 OSGi (Apache Felix) 中处理不同的日志记录解决方案
【发布时间】:2015-05-07 02:06:07
【问题描述】:

在 OSGi 中,日志记录前端和实际输出是分开的。

所以,通过使用LogService,这并不意味着任何东西都会被写入控制台。这就是 LogReaderService 的职责。

在我当前的运行时,我添加了 org.apache.felix.log,它带来了一个应该负责输出的 LogReaderService-Implementation。但我仍然没有在控制台上看到任何东西……尽管其他捆绑包中有很多其他东西。

在下一步中,我创建了自己的 LogListener,它应该由 LogServiceReader 调用。我刚刚使用了this article 的代码并调试了Activator 以查看是否添加了侦听器。还是没有输出。

最后我检查了 Felix 属性并设置了 felix.log.level=3 (Info) 但同样没有输出。 我更想知道的是,尽管将级别设置为信息,我仍然可以看到很多调试信息?

16:47:46.311 [qtp1593165620-27] DEBUG org.eclipse.jetty.http.HttpParser

在我看来,有不同的日志记录策略,它们使用不同的配置属性。例如,在我将 pax-logging-service(它使用经典的日志记录方法)添加到我的运行时后,我可以看到输出,但目前我想坚持使用 felix-logging。

谁能解释一下如何禁用 Blueprint-Debug-Level,我猜这是导致当前输出的原因,并通过 LogService 启用简单的 felix-logging? 必须有一个标准控制台实现即使它没有在规范中指定。

【问题讨论】:

  • 使用LogService的人不多。如果您只需要普通日志记录,请查看 pax-logging。 ops4j1.jira.com/wiki/display/paxlogging/… 它允许在您的代码中简单地使用支持的日志框架之一,并使用 log4j 配置样式配置所有日志记录。
  • 我想知道为什么。使用经典日志,我需要为每个使用日志的模块提供某种形式的配置文件,而使用 LogService,我可以写入我需要的任何存储(例如数据库)而不影响客户端。
  • 我们使用 felix 日志记录和一个简单的包,该包实现了一个 LogListener 并将每个 LogEntry 转发到 SLF4J(将所有内容记录到控制台)。您可以使用它或在一小时内实现自己的(例如:直接转发到控制台或具有配置选项)。我们的课程在github.com/everit-org/osgi-loglistener-slf4j/blob/master/core/…,您可以从 Maven Central 下载捆绑包。
  • 如果您使用普通的 log4j 或其他非 OSGi 框架之一,这是一个很大的痛苦。使用 pax 日志记录,您可以使用所有日志记录 API,而且效果很好。在 karaf 和 camel 等大多数 apache 项目中,我们使用 slf4j API 和 pax 日志记录。

标签: osgi apache-felix blueprint


【解决方案1】:

感谢 Christian Schneider 和 Balazs Zsoldos:两位 cmets 都非常有帮助。

要回答这个问题:我需要提供一个 ServiceTrackerCustomizer,如 Balazs 示例 here 中所示。由于我已经有一个 ConsoleLogListener,因此向 TrackerCustomizer 注册监听器就足够了。


由于我当前的任务是迁移一个大型遗留应用程序,我想在其中引入 OSGi,因此使用 Pax-Logging 可能更有意义,因为我们已经在数百个类中使用了 log4j可能不会更改为 LogService。

Pax-Logging 的输出可以通过将 org.ops4j.pax.logging.DefaultServiceLog.level 属性设置为 INFO

进行调整

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多