在阅读了有关内容之后,我感到自己理解了,现在我感到困惑。这是我的期望和所做的:
我希望登录Karaf,重新加载我的捆绑包,然后运行log:tail
,最终看到如下日志消息:
13:28:47.265 INFO [Blueprint] You just created a class called: MyClass.
使用的技术: -由Apache Karaf实现的OSGI容器 -白羊座实施的蓝图
我的OSGI捆绑包从Karaf导入了pax记录器
org.slf4j.*; provider=paxlogging
据我了解,这意味着将在运行时为仅使用API的应用程序提供对Karaf单例记录器的引用。
我的类使用SLF4J接口,因此依赖项slf4j-api:slf4j-api:1.7.26
存在于我的项目中。
存在一个类
班级服务模型
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
蓝图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>
答案 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中提供。这东西在后台做东西:
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,