ログ4j:リクエストごとに 1 つのログ ファイル
-
22-09-2019 - |
質問
コンシューマーからの複数のリクエストを同時に処理する Weblogic バッチ アプリケーションがあります。目的のログ記録には log4j を使用します。現時点では、複数のリクエストに対して単一のログ ファイルにログインします。すべてのリクエストのログは 1 つのファイルに保存されるため、特定のリクエストの問題をデバッグするのは面倒になります。
したがって、リクエストごとに 1 つのログ ファイルを作成する予定です。コンシューマは、処理を実行する必要があるリクエスト ID を送信します。ここで、実際には、複数のコンシューマがアプリケーションにリクエスト ID を送信する可能性があります。したがって、問題は、リクエストに基づいてログ ファイルを分離する方法です。
実稼働サーバーを毎回起動および停止することはできないため、日付タイムスタンプまたはリクエスト ID を使用してオーバーライドされたファイル アペンダーを使用する意味は除外されます。これについては以下の記事で解説しています。http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/
また、次の代替案も試してみました。
http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html
http://www.mail-archive.com/log4j-user@logging.apache.org/msg05099.html
このアプローチでは望ましい結果が得られますが、複数のリクエストが同時に送信されると正しく機能しません。いくつかの同時実行の問題により、ログがあちこちに表示されます。
皆さんからの助けを期待しています。前もって感謝します....
解決
ここでは、同じトピックに関する私の質問です: 動的に作成&ロギングを破壊するアペンダする
私はLog4Jのメーリングリストで、まさにこのような何かをやって議論するスレッド上で、このフォローアップ: http://www.qos.ch/pipermail/logback-ユーザー/ 2009-8月/ 001220.htmlする
CECI Gulcu(のlog4jの発明者)が、それは良いアイデアだったとは思いませんでした...代わりにLogbackを使用して提案します。
我々は先に行って、カスタムファイルアペンダを使用して、とにかくこれをしませんでした。詳細は、上記の私の議論を参照してください。
他のヒント
SiftingAppender のlogback(log4jの後継)で出荷を見、それはありますランタイム基準に関するアペンダの作成を処理するために設計されています。
あなたのアプリケーションは、単にセッションIDに基づいて弁別を作成し、セッションごとに1つのログファイルを作成する必要がある場合。弁別器を書くことは、コードの3本の又は4線を含むので、かなり簡単であるべきです。ヘルプが必要な場合はlogback-userメーリングリストにシャウトます。
この問題は次のように非常にうまく処理されます ログバック. 。自由があれば選択することをお勧めします。
できると仮定すると、使用する必要があるのは ふるい分けアペンダー. 。これにより、実行時の値に応じてログ ファイルを分割できます。つまり、ログ ファイルを分割する方法には幅広いオプションがあります。
ファイルを分割するには requestId
, 、次のようなことができます。
ログバック.xml
<configuration>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>requestId</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender">
<file>${requestId}.log</file>
<append>false</append>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
</layout>
</appender>
</sift>
</appender>
<root level="DEBUG">
<appender-ref ref="SIFT" />
</root>
</configuration>
ご覧のとおり(内部は) discriminator
要素)、ログの書き込みに使用されるファイルを区別することになります。 requestId
. 。つまり、各リクエストは一致するファイルに送信されます。 requestId
. 。したがって、次の 2 つのリクエストがある場合、 requestId=1
そして 1 つのリクエスト requestId=2
, の場合、ログ ファイルは 2 つになります。 1.log
(2 エントリ) および 2.log
(1 エントリ)。
この時点で、どのように設定すればよいのか疑問に思うかもしれません。 key
. 。これは、キーと値のペアを MDC (キーはで定義されたものと一致することに注意してください) logback.xml
ファイル):
リクエストプロセッサ.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 を持つリクエストが受信されるたびに、そのリクエストに対して新しいファイルが作成されます。