Log4j:リクエストごとに1つのログファイル

batch-processing java java-ee log4j
Log4j:リクエストごとに1つのログファイル

コンシューマからの複数のリクエストを同時に処理するweblogicバッチアプリケーションがあります。 puposeのロギングにはlog4jを使用します。 現在、複数のリクエストに対して単一のログファイルにログインします。 ログはすべて単一のファイルにあるため、特定のリクエストの問題をデバッグするのは面倒です。

そのため、リクエストごとに1つのログファイルを作成する計画です。 コンシューマーは、処理を実行する必要がある要求IDを送信します。 現在、実際には、アプリケーションにリクエストIDを送信する複数のコンシューマーが存在する可能性があります。 質問は、リクエストに基づいてログファイルをどのように分離するかです。

運用サーバーを毎回起動および停止することはできないため、日付タイムスタンプまたは要求IDでオーバーライドされたファイルアペンダーを使用することは禁止されています。 これは、以下の記事で説明されているものです:http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

また、これらの代替案を試してみました:

この方法では目的の結果が得られますが、複数のリクエストが同時に送信された場合、適切に機能しません。 いくつかの並行性の問題のため、ログはあちこちに行きます。

皆さんからの助けを期待しています。 前もって感謝します…​.

  3  3


ベストアンサー

同じトピックに関する私の質問は次のとおりです:https://stackoverflow.com/questions/1239227/dynamically-creating-destroying-logging-appenders [ロギングアペンダーの動的な作成と破棄]

Log4Jメーリングリストでこのようなことを行うことを議論するスレッドでこれをフォローアップします:http://www.qos.ch/pipermail/logback-user/2009-August/001220.html

Ceci Gulcu(log4jの発明者)は、それが良い考えだとは思いませんでした…​代わりにLogbackを使用することを提案しました。

とにかく、カスタムファイルアペンダーを使用してこれを行いました。 詳細については、上記の私の議論をご覧ください。

4


SiftingAppenderでlogback(log4jの後継)に同梱されているのを見てください。ランタイム基準でアペンダーの作成を処理するように設計されています。

アプリケーションでセッションごとに1つのログファイルのみを作成する必要がある場合は、セッションIDに基づいて識別子を作成するだけです。 弁別器の作成には3行または4行のコードが含まれるため、非常に簡単です。 ヘルプが必要な場合は、logback-userメーリングリストで叫んでください。

4


この問題は、https://logback.qos.ch/manual/appenders.html#SiftingAppender [Logback]によって非常にうまく処理されます。 自由があればそれを選ぶことをお勧めします。

可能な場合、使用する必要があるのはhttps://logback.qos.ch/manual/appenders.html#SiftingAppender[SiftingAppender]です。 ランタイム値に応じてログファイルを分けることができます。 これは、ログファイルを分割する方法の幅広い選択肢があることを意味します。

`requestId`でファイルを分割するには、次のようなことができます:

  • logback.xml *

      requestId
      unknown



        ${requestId}.log
        false

          %d [%thread] %level %mdc %logger{35} - %msg%n

ご覧のように( discriminator`要素内)、 requestId`にログを書き込むために使用されるファイルを区別します。 つまり、各リクエストは、一致する「requestId」を持つファイルに送られます。 したがって、「requestId = 1」という2つのリクエストと「requestId = 2」という1つのリクエストがある場合、「1.log」(2エントリ)と「2.log」(1エントリ)という2つのログファイルがあります。

この時点で、「キー」を設定する方法を疑問に思うかもしれません。 これは、キーと値のペアをhttps://github.com/qos-ch/slf4j/blob/master/slf4j-api/src/main/java/org/slf4j/MDC.java[MDC](注そのキーは、 `logback.xml`ファイルで定義されたものと一致します):

  • RequestProcessor.java *

public class RequestProcessor {

    private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java);

    public void process(Request request) {
        MDC.put("requestId", request.getId());
        log.debug("Request received: {}", request);
    }
}

そして、それは基本的にシンプルなユースケースのためのものです。 これで、異なる(まだ検出されていない)IDを持つリクエストが到着するたびに、新しいファイルが作成されます。

2


タイトルとURLをコピーしました