当前位置: 首页 > 知识库问答 >
问题:

阿帕奇菲利克斯OSGi日志记录

易烨磊
2023-03-14

我当前的应用程序使用Logback进行日志记录。我使用ApacheFelix部署了一个OSGi框架,允许在运行时动态注册捆绑包。Felix设置如下:

    ...

    //System.out.println("Building OSGi Framework");
    FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
    Map<String, String> config = new HashMap<>();

    // specify the class loader
    config.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_FRAMEWORK);

    // specify the osgi cache directory
    config.put(Constants.FRAMEWORK_STORAGE, appConfig.getOsgiCacheDir());

    // make sure the cache is cleaned
    config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);

    // expose api
    config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "list.of.packages.to.export");

    // more properties available at: http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html
    config.put("ds.showtrace", "false");
    config.put("ds.showerrors", "true");
    config.put("felix.fileinstall.dir", appConfig.getActiveOsgiExtDir());
    config.put("felix.fileinstall.tmpdir", appConfig.getTempOsgiExtDir());
    config.put("felix.fileinstall.bundles.startTransient","true");
    config.put("felix.fileinstall.poll","5000");
    config.put("felix.fileinstall.bundles.new.start", "true");

    LOG.debug("OSGi config: " + config.toString());

    framework = frameworkFactory.newFramework(config);

    try {
        framework.init();
        FrameworkEvent event;

        do {
            framework.start();
    ...

唯一的问题是Felix似乎没有日志记录。当一个包由于某种原因无法加载时,我不知道为什么!我知道我可以使用捆绑包中的以下内容来获取父记录器:

ServiceReference ref = bundleContext.getServiceReference(LogService.class.getName());
if (ref != null) {
    LogService log = (LogService) bundleContext.getService(ref);
    ...
   }

然而,我不明白首先如何让felix使用logback作为日志记录器。

共有1个答案

郗缪文
2023-03-14

我猜你使用Apache Felix Log在你的OSGi容器中有一个LogService。Apache Felix Log实现了OSGi企业规范的“101日志服务规范”一章。

LogService 的基本实现会将记录的条目存储一段时间,但不会将它们写入任何位置。您可以通过 LogReaderService 或 LogListener 查询记录的条目。

另一方面,您可能会像在OSGi容器中添加slf4j api和slf4j Logback那样使用Logback。这样,通过slf4j api类记录的所有内容都将通过logback记录。

如果我的猜测是正确的,osgi-loglistener-slf4j包可以帮助您。这个包除了为环境中的每个LogReaderService注册一个LogListener,并将它捕获的每个日志条目转发给slf4j-api之外,什么也不做。该包可以在maven-central上获得

如果您不想使用 slf4j API,可以编写一个类似的捆绑包,用于将日志从 LogReaderService 转发到 Logback。如果您检查我链接的捆绑包的源代码,您会发现它仅通过几行代码实现。

 类似资料:
  • 我正在使用Pax考试(3.5.0)进行OSGi单元测试。我已经创建了一个测试,但是当我运行它时,我得到了这个堆栈跟踪: 我已经配置了在选项中,我看到了。 但我还是有例外。有人知道我做错了什么吗? 干杯

  • 我正在做一个学术项目,涉及传感器的流数据。我已经包围了苍鹭(Storm的接班人)和尼菲。两者都支持内置背压,这对我的项目至关重要。Apache Nifi和Heron之间的主要区别是什么? 哪款更适合物联网应用?

  • 我们看到的是Apache Nifi和Gobblin,它们似乎在意图上有重叠。什么样的用例最适合哪个平台?它们将如何符合上面的用例? 谢了!

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我们使用ivy来管理一个多项目java应用程序,最近当我们进行构建时,这个错误开始出现。这是什么原因?

  • 我正在使用Flink从Apache Pulsar读取数据。我在pulsar中有一个分区主题,有8个分区。在本主题中,我生成了1000条消息,分布在8个分区中。我的笔记本电脑中有8个内核,因此我有8个子任务(默认情况下,并行度=#个内核)。在执行Eclipse中的代码后,我打开了Flink UI,发现一些子任务没有收到任何记录(空闲)。我希望所有8个子任务都能得到利用(我希望每个子任务都映射到我的主