2013-08-05 161 views
0

我正在实现一个在目标硬件上运行的非常轻量级(嵌入式)OSGi框架。要附加控制台,我使用org.apache.felix.gogo.shell和org.apache.felix.shell.remote。在OSGi控制台上打印消息

到目前为止,我已经使用System.out.println记录了所有自定义消息,这些消息工作正常,但现在我使用的是远程控制台,我需要某些东西可以将我的消息“打印”到OSGi控制台(并希望同时出现在目标控制台以及由felix.shell.remote提供的telnet控制台上)。

我猜一定有办法得到一个OutputStream(或类似)的句柄来做到这一点;我的问题是如何?似乎大多数人重定向他们的stdout等来解决这样的问题。

我正在使用声明式服务,所以我希望能够设置一个组件,它附加了一个引用的服务(不重要,但会使它更好,更整洁)。

任何帮助,非常感谢。

回答

1

最好的方法是使用OSGi日志服务对自定义消息进行日志记录。这样,您可以从shell或webconsole中获取来自LogReader服务的最新日志。如果你坚持使用流行的框架,比如log4j等,那么你可以通过Pax日志记录获得一个桥梁。

或者,将输出重定向到已知位置的文件。然后,您可以在gogo中查看该文件或提供一个连续显示文件新部分的尾部功能。

+0

我已经得到了一个非常具体的日志实现(对数据库;我有非常严格的磁盘空间要求),所以我真的很犹豫要触摸OSGi日志服务(除非你可以关闭写入​​磁盘? )。 我真的在shell运行时暴露出一个服务,它给了我一个输出流,或者为每个连接的控制台输出流。 我想我可以使用CommandProvider并保存CommandInterpreter(ci)对象,然后对每个日志消息使用ci.print(),但是看起来ci对象在该方法结束后会被销毁(重定向到主控制台代替)。 – Aaron

+0

OSGi日志服务只是一个中介。它在启动过程中保留一个简短的缓冲区来保存历史记录因此,捕获日志记录并将其写入磁盘是非常有用的。请参阅OSGi日志读取器服务。 –