Osgi 奥斯基伐木厂

Osgi 奥斯基伐木厂,osgi,Osgi,在我的OSGI工作中,我遇到了另一个看似简单的日志问题 我们已经将日志记录到了我们的捆绑包中,它可以正常工作。实际上,我们正在使用pax日志记录服务来为我们完成繁重的工作 import org.ops4j.pax.logging.PaxLoggingService; import org.osgi.service.component.*; @Component( immediate=true ) public class ComponentImpl implements TimeService

在我的OSGI工作中,我遇到了另一个看似简单的日志问题

我们已经将日志记录到了我们的捆绑包中,它可以正常工作。实际上,我们正在使用pax日志记录服务来为我们完成繁重的工作

import org.ops4j.pax.logging.PaxLoggingService;
import org.osgi.service.component.*;

@Component( immediate=true )
public class ComponentImpl implements TimeService {

    @Reference
    private PaxLoggingService logs;

    @Activate
    public void activate(ComponentContext ctx)
    {
        // deprecated legacy interface
        logs.log(PaxLoggingService.LOG_INFO, "Activate called at " + getTime());
        logs.log(PaxLoggingService.LOG_INFO, "Activated component " + ctx.getProperties().get("component.id"));
    }
}
但有两件事困扰着我们。首先,直接使用
公共void日志(int-level,String-message)
方法已经完成。其次,我们更愿意通过OSGI日志服务进行日志记录

然而,这似乎并不那么容易奏效。我们第一次尝试使用更新的日志接口,首先构造一个记录器实例,然后通过该接口进行日志记录,这将导致Java AbstractMethodError:

@Component( immediate=true )
public class ComponentImpl implements TimeService {

    @Reference
    private PaxLoggingService logs;

    @Activate
    public void activate(ComponentContext ctx)
    {
        // fancy, new logging interface - throws exception
        Logger logger = logs.getLogger(ComponentImpl.class);
        logger.log(PaxLoggingService.LOG_INFO, "Activate called at " + getTime());
    }
}
运行时异常(当我们尝试ApacheFelix的LoggerService实现时也发生了这种情况)

理想情况下,您不希望在
activate()
中初始化记录器实例,而是由框架进行设置。

不幸的是,这个例子也不起作用。引用未得到解析,因此捆绑包从未运行。。。我一直在网上搜索,但没有找到任何相关的东西。似乎大多数人不使用OSGI服务接口进行日志记录,而是使用slf4j(或另一个façade);Pax将以任何方式捕获日志条目。所以从技术上讲,这没有什么区别

我认为我们的问题是没有人(PAX和Felix)实现OSGI LoggerFactory接口

  • 有没有一个OSGI LogService实现可以做到这一点 实施伐木工厂
  • 通过“隐式”通道(如导入slf4j)而不是使用“显式”OSGI接口登录是否有利
目前登录OSGi的最佳实践是使用slf4j作为前端

Logger log = LoggerFactory.getLogger(this.getClass());
只需在课堂上使用它。Pax日志为它提供了后端,它还可以与logback后端一起工作

OSGiR7提供了一些改进的日志服务集成,但我认为这在平台中还没有广泛使用

使用@Reference进行日志记录的优点是,当您的日志记录后端可能还不可用时,它可以消除启动时的计时问题

如上所述的slf4j集成的优点是,它甚至适用于需要在OSGi之外工作的混合JAR。

  • 到目前为止(3月19日),已经(至少)完全实现了OSGi日志记录1.4

  • 据我所知,显式使用OSGi记录器的最简单方法就是通过这个。声明日志程序与slf4j或log4j一样简单,不需要SCR(或类似文件)

@Component
public class MyComponent {
  @Reference(service=LoggerFactory.class)
  private Logger logger;
  @Activate
  void activate(ComponentContext context) {
    logger.trace(“activating component id {}”,
      context.getProperties().get(“component.id”));
  }
}
Logger log = LoggerFactory.getLogger(this.getClass());