0

マルチスレッドに forkjoinpool を使用し、ロギングに log4j を使用するプロジェクトに取り組んでいます。私たちのプロジェクトでは、複数の「ジョブ」が並行して実行されており、各ジョブは 1 つのスレッドによってのみ処理されます。

ロギングの問題は、対応するログ エントリにジョブ ID 情報が含まれるように、ロガーにジョブ ID のプレフィックスを付けることができるジョブのメイン フロー内にあります。ただし、各ジョブの処理に沿って、多くのユーティリティ API が呼び出され、そのような API 内からのログ エントリにはジョブ情報がありません。log4j はスレッド ID を出力するので、これはさまざまなジョブのログを区別する方法ですが、ユーティリティ API ログにジョブ ID を追加する最も簡単で最良の方法は何でしょうか?

正しい方向に進んでいるかどうかわからない、大まかに2つの考えがあります。

  1. スレッド名を自分のジョブ ID に置き換える方法があれば、log4j のデフォルトのスレッド プレフィックスで問題ないと思います。
  2. または、ロガーがジョブ情報を出力できるように、ロガーを入力として受け取るユーティリティ メソッドを作成する必要がありますか?

アドバイスしてください、ありがとう。

4

1 に答える 1

1

このような場合、マップされた診断コンテキストは、ジョブ ID を追跡する優れた方法です。スレッドごとに設定 (および句で削除) し、パターン レイアウトのスレッド名のように参照できます。finally

@Override
protected void compute() {
  MDC.put("job-id", jobId);
  try {
    /* Do your task */
  } finally {
    MDC.remove("job-id");
  }
}
于 2015-11-21T00:06:04.923 に答える