2013-06-19 82 views
7

我有一個C++庫,Java應用程序正在通過JNI使用它。在Java應用程序中,我使用logback生成日誌。從C++到Java記錄消息

現在我需要記錄C++庫消息以及我必須在Java使用的同一文件中執行此操作,以便按時間順序將所有內容都包含在內。

我目前尚未實現的方法是創建一個名爲Logger的C++類,它將通過JNI將消息發送給Java,然後Java會記錄這些消息。缺點是我失去Logback功能,例如記錄線程的名稱或生成日誌的代碼的行。

有沒有更好的方法?

+2

'__LINE__'和相關的宏可能是你的朋友在這裏。 –

+1

我懷疑線程和代碼行是你必須添加到他自己消息。 Logback將嘗試爲您運行它的Java代碼獲取此信息。如果您在與調用Logback不同的線程中運行,則只會失去該線程的名稱。 –

+0

你可以在C/C++中獲得代碼行嗎?除了'__LINE__'宏嗎? – SJuan76

回答

-1
#include <android/log.h> 

... 
int error; 
... 
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Some error: code = %d", error); 
... 
+0

我的問題不適用於Android。 – dablak

1

一個簡單的解決方案是使用通用服務進行日誌記錄,如syslog。 在您的Java代碼中,設置適當的appender將日誌寫入syslog。在你的C++代碼中,只需簡單地調用syslog。所有日誌將按照syslog的時間順序進行組合。

1

一個可能的解決方案我已經在過去使用: -

  1. 使用的logback與數據庫的appender。該數據庫將確保 事務提交按順序與時間戳。在某些數據庫 中,您可以使其成爲觸發器並使用本地時間戳,該時間戳可能更有效。

  2. C++部分將需要有一個類似的appender和/或修改寫入相同的表。 (log4cpp的作品,或者如果你有一個專有的 ,它可能需要稍微修改)

  3. 選擇*從時間戳按時間排序asc輸出到一個文件將按順序給你日誌。

我在去年的地方,我們使用的SQLite存儲這些日誌相比,Oracle或更重型一個開銷又小,如果以後需要,我們可以刪除該文件。