2013-08-05 159 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日誌讀取器服務。 –