5

さまざまなポイントから呼び出されるマルチスレッドデータアクセスレイヤーを持つJavaのレイヤードアプリケーションがあります。この層への単一の呼び出しは、DB への要求を並列化するために複数のスレッドを生成する可能性があります。

私が探しているのは、さまざまなスレッドで構成される「アクティビティ」を定義できるロギング ツールです。したがって、データ アクセス層の同じメソッドは、呼び出し元に応じて異なる出力をログに記録する必要があります。操作の総コストを要約するために、さまざまな出力をグループ化する機能も重要です。

アプリケーションは Java ですが、言語は制限ではありません。私が必要としているのは、最終的にそれを実装するための設計ガイドラインです。現在log4jを使用していますが、この動作を取得できません。

4

8 に答える 8

5

また、log4jのネストされた診断コンテキスト機能も確認する必要があります。呼び出し元ごとに異なるコンテキストをロガーにプッシュすると、うまくいく場合があります。

于 2008-09-17T13:36:27.197 に答える
5

ロガーを渡すことができるはずなので、タスクデータの「共通」に基づいてロガーを作成します-つまり、ユーザー名など。次に、このロガーをパラメーターとして必要なすべてのメソッドに渡します。そうすれば、log4j 構成ファイルでさまざまなフィルターやルールを設定できるようになります。または、ロガー名に基づいて出力ファイルをスクレイピングします。

編集: log4j の MDC および NDC クラスも確認してください。そこにコンテキストデータを追加できます。

于 2008-09-17T13:39:05.333 に答える
3

私の (Web) アプリケーションの 1 つで、ロギング情報を StringBuilder に取り込む ThreadLocal ロガーを使用しています。trace パラメータが設定されている場合、ロガー オブジェクトは HttpServlet#service メソッドで初期化されます (設定されていない場合は、非常に高速な null-logger が存在します)。結果の出力は、要求元のページに HTML コメントとしてダンプされるか、ログ ファイルの 1 つのセグメントに書き込まれます。

于 2008-09-17T18:00:19.917 に答える
3

log4j では、「%t」パターンでスレッド名をログに記録できます。log4j パターン レイアウトを参照してください。

于 2008-09-17T13:33:52.023 に答える
0

Java5(およびそれ以降)では、呼び出すことができます

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

必要な深さまでスタック トレースを検査し、それに応じてログに記録します。

Java 1.4 では、同じ情報を取得できます

StackTraceElement[] stackTrace = new Exception().getStackTrace();
于 2008-09-17T13:33:59.743 に答える
0

現在の「アクティビティ」を識別する構造をデータ アクセス層に渡す必要があります。意味のある「Activity」クラスが既にある場合、 Sunny が提案したように Logger インスタンスを使用する場合、またはアクティビティ コンテキストを追跡するために 3 番目の構造を使用する場合があります。

いずれにせよ、「アクティビティ」は複数のスレッドで処理されるため、他の現在の回答のほとんどが示唆するように、現在の「アクティビティ」を追跡するためにスレッドローカルストレージを使用することはできません。明示的に渡す必要があります。

次のようなメソッドでインターフェイスを拡張するlog4jの上に小さなファサードを作成することをお勧めします

void debug(Activity activity, String message);

アクティビティ コンテキストをデータ アクセス層から this に渡します。

現在のアクティビティをデータ アクセス レイヤーに渡せるようにするには、データ アクセス レイヤーに何らかの変更を加える必要がありますが、それを行う最善の方法は、現在のインターフェイスに大きく依存します。ワークスペース パターンを使用する場合、ワークスペース クラスに setActivity() メソッドを追加するだけでよい場合がありますが、他のインターフェイス パターンでは、すべてのメソッドにアクティビティ パラメーターを追加する必要がある場合があります。

何らかの理由でデータ アクセス レイヤーを変更できない、または変更したくない場合は、もちろん、データ アクセス レイヤーを呼び出す前にアクティビティ コンテキストをスレッド ローカル ストレージに格納し、サブスレッドを生成するかエンキューする直前にそれを取得することができます。データ アクセス層のジョブ。これは実行可能な解決策ですが、そのように情報を渡すのは少し危険ですか?

于 2008-09-17T13:58:31.433 に答える
0

ロガーオブジェクトをスレッドに関連付けたいと思います。各スレッドの log4j ロガー インスタンスを保持する ThreadLocal 変数が役立つ場合があります。

http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

于 2008-09-17T13:34:26.187 に答える