ロギングにLogbackを使用するとします。
特定のイベント (関数呼び出しなど) が発生するたびに、ログ ファイルへのパスを変更する必要があります。
たとえば、どこかで関数を呼び出します。
startNewLogSegment("A")
このイベントの後、ロガーはlogs/mySegment_A.log
ファイルへの書き込みを開始することが期待されます。次に、再び呼び出しが実行されました。
startNewLogSegment("B")
このイベントの後、ロガーは前のファイルへの書き込みを終了し、logs/mySegment_B.log
ファイルへの書き込みを開始することが期待されます。
startNewLogSegment
によって変更された状態は、アプリケーション全体 (すべてのスレッド) で表示される必要があると仮定しましょう。
私はMDCでアプローチを適用しようとしました:
logback.xml
...
<appender name="SIFTING_BY_ID" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>id</key>
<defaultValue>initial</defaultValue>
</discriminator>
<sift>
<appender name="FULL-${id}" class="ch.qos.logback.core.FileAppender">
<file>logs/mySegment_${id}.log</file>
<append>false</append>
<encoder >
<pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}.%M - %msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
...
MDC.put("id", "A")
カスタムイベントが表示されたときに呼び出します。
しかし、それは私が必要とする方法とは異なる方法で機能します。
MDCはスレッドごとにコンテキスト情報を管理することが知られているため、上記の目標を達成するには、少なくともスレッドの作成を制御する必要があります。
このアプローチは、Spring、特に Spring Reactor によって実行される非同期操作で使用できるのではないかと思います。内部 Spring アクティビティにカスタム スレッド プールを使用することに関する情報は見つかりませんでした。
おそらく、Spring の内部構造を悪用することなく、そのようにロギングを調整するもっと簡単な方法があることを願っています。