如何在Karaf中进行容器初始化期间记录由Blueprint(白羊座)创建的对象的初始化?

时间:2019-07-16 11:31:54

标签: logging osgi apache-karaf blueprint-osgi blueprint

在阅读了有关内容之后,我感到自己理解了,现在我感到困惑。这是我的期望和所做的:

我希望登录Karaf,重新加载我的捆绑包,然后运行log:tail,最终看到如下日志消息:

13:28:47.265 INFO [Blueprint] You just created a class called: MyClass.

使用的技术: -由Apache Karaf实现的OSGI容器 -白羊座实施的蓝图

  1. 我的OSGI捆绑包从Karaf导入了pax记录器

    org.slf4j.*; provider=paxlogging

据我了解,这意味着将在运行时为仅使用API​​的应用程序提供对Karaf单例记录器的引用。

  1. 我的类使用SLF4J接口,因此依赖项slf4j-api:slf4j-api:1.7.26存在于我的项目中。

  2. 存在一个类

班级服务模型

public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
  public MyClass() {
    LOGGER.info("You just created a class called: {}", this);
  }
  @Override
  public String toString() { return "MyClass" };
}

我只是遵循了OSGI LoggerFactory的规范:

  

此API的用户不得实现此类型https://osgi.org/specification/osgi.cmpn/7.0.0/service.log.html#org.osgi.service.log.LoggerFactory

  1. 白羊座创造一个:

蓝图XML

<?xml version="1.0" encoding="UTF-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<description>
    A sample Blueprint XML to demonstrate 
    the initialization procedure in the hopes of reproducing a problem.
</description>

<bean id="myclass1" class=com.stack.MyClass/>
</blueprint>

相关

2 个答案:

答案 0 :(得分:0)

您不需要特殊处理即可在karaf中启用slf4j登录。 只需像以前一样使用登录Java代码的方式,让Maven捆绑包插件为您创建包导入即可(无需特殊配置)。

到OSGi R7日志服务规范的链接是即将进行的日志记录标准化。基本上,此规范允许将记录器作为OSGi服务注入。从技术上讲,它比karaf(实际上是pax-logging)今天做的要干净。 在karaf中,此规范尚未实现。

答案 1 :(得分:0)

知道了这一点

捆绑中编译的SLF4J API是故事的一部分。其余的由org.ops4j.pax.logging.pax-logging-api在Karaf / Felix中提供。这东西在后台做东西:

  1. 建立自己的单例记录器工厂。
  2. 立即启用SLF4J API支持并记录一条消息。
  3. 单例记录器工厂之一是创建记录器的SLF4J API Slf4jLoggerFactory。它拥有对PaxLoggingManager对象(Slf4jLoggerFactory.setPaxLoggingManager(manager),其中管理者为new OSGIPaxLoggingManager(bundleContext))的静态引用。此单例中的方法getLogger返回一个new Slf4jLogger(name, paxLogger)对象(其中名称通常是类名,而paxLogger来自FallbackLogFactory.createFallbackLog(FrameworkUtil.getBundle(Logger.class), name)m_paxLogging.getLogger(name, Slf4jLogger.SLF4J_FQCN)Slf4jLogger

因此,有必要绑定到此特定的Slf4jLoggerFactory(实现ILoggerFactory),以便捆绑软件中的所有类在调用getLogger(class)时都能获得正确的引用。看来,Aries Blueprint的问题在于,它懒惰地将SLF4J API绑定到headers org.ops4j.pax.logging.pax-logging-api提供的实现中。因此,我遵循Christian Schneider的建议,并在Blueprint中创建了一个顶级参考,该参考迫使Blueprint等待Pax Manager准备就绪:

 <reference id="logService" interface="org.osgi.service.log.LogService" availability="mandatory" activation="eager"/>

然后,其他高层管理者可以使用depends-on来依靠它:

<bean id="MyRegistry" class="com.foo.MyRegistry" scope="singleton" factory-method="getSingletonInstance" depends-on="logService">

当然,我需要在OSGI MANIFEST.MF中添加以下内容

Import-Package:
org.slf4j;version="[1.7.0,2.0.0)",
org.osgi.service.log,