是否有可能获得更改捆绑状态的日志?

时间:2015-01-15 06:39:21

标签: osgi bundle

我使用 osgi控制台。命令ss非常有用,但我想观察每个bundle的状态变化以进行调试。可能吗?

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。

使用LogService

请参阅OSGi Compendium规范中 101日志服务规范章节下的 101.6.1 Bundle Event Mapping 一章:

简而言之:如果容器中有LogService实现,则会记录每个Bundle和Service事件。可以使用LogReaderService读取记录的记录。 Equinox有一个内置的实现,在Felix中我通常使用implemented by Felix

在容器中有一个LogService实现后,你应该以某种方式实现将结果写入控制台。这里有几种方法。我可以推荐的是:

  • 安装一个slf4j实现包(例如:slf4j-simple,只需将所有内容记录到标准输出中)和slf4j-api
  • 安装Everit Loglistener To SLF4J,将每个日志条目转发到SLF4J API。 SLF4J将写入比控制台的条目

实施BundleListener

您可以使用BundleListener

捕获所有实时捆绑事件

实施BundleTracker

您可以实现BundleTracker,以便捕获所有Bundle事件。在这种情况下,您将获得在打开跟踪器之前发生的已安装捆绑包的最后事件(至少已安装)。

答案 1 :(得分:0)

另一种方法是使用Byteman。它会是这样的:

####################################################

RULE Bundle state change
CLASS org.eclipse.osgi.framework.internal.core.AbstractBundle
METHOD beginStateChange()
IF TRUE
DO
System.out.println("[STATE CHANGE] " + $this.getBundle() + " > " + $this.getBundle().getState());
ENDRULE

####################################################

RULE Bundle complete state change
CLASS org.eclipse.osgi.framework.internal.core.AbstractBundle
METHOD completeStateChange()
AT EXIT
IF TRUE
DO
System.out.println("[COMPLETE STATE CHANGE] " + $this.getBundle() + " > " + $this.getBundle().getState());
ENDRULE