2013-06-19 12 views
7

私はJNIを介してJavaアプリケーションによって使用されているC++のライブラリを持っています。 Javaアプリケーションではログを生成するためにログバックを使用しています。C++からJavaへのメッセージのログ

これでC++ライブラリメッセージもログに記録する必要があり、Javaで使用されているのと同じファイルで実行する必要があります。

私の現在のアプローチは、という名前のC++クラスを作成して、Loggerを作成して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コードで、ログをsyslogに書き込むように適切なアペンダを設定します。あなたのC++コードでは、単にsyslogをネイティブに呼び出します。すべてのログは、syslogによって時系列順に結合されます。

1

私が過去に使用した可能性のある解決策: -

  1. 使用logbackデータベースアペンダを持ちます。 DBは、 トランザクションコミットをタイムスタンプで順番に確保します。一部のデータベースでは、 をトリガーにしてより効率的な のネイティブタイムスタンプを使用できます。

  2. C++のパートでは、同じテーブルに書き込むために同じようなアペンダーや修正が必要です。 (log4cppが動作する場合、または 独自のものがある場合は、わずかに変更する必要があるかもしれません)

  3. *タイムスタンプでテーブル順を選択すると、ファイルへの出力が順番にログに記録されます。私の最後の場所で

我々はオーバーヘッドがオラクル以上のヘビーデューティー1に比べて小さなあったように、これらのログを格納するためのsqliteを使用し、後で必要に応じて、我々は、ファイルを削除することができます。

関連する問題