私は自分でこの問題に遭遇しましたが、それを理解するのに長い時間がかかりました. 私が見つけた答えのほとんどは、ソリューションの一部しかなく、それがどのように/なぜ機能するかを説明していません...これにより、ユースケースがわずかに異なる場合、適応が難しくなります。
例:
<target name="log"
xsi:type="File"
fileName="${basedir}/logs/log.${longdate:cached=true}.log"
layout="${message}"
archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log"
archiveAboveSize="5242880"
archiveEvery="Day"
archiveNumbering = "Rolling"
maxArchiveFiles="20"
/>
説明
Cached Layout Renderer と longdate 変数の両方を使用する必要があります。これが機能する理由を理解するには、それらがどのように機能し、どのように相互作用するかを理解する必要があります。
長い日付:
fileName="${basedir}/logs/log.${longdate}.log"
ログ名に longdate 変数を使用すると、実行ごとに新しいログ ファイルが作成されることがほぼ保証されます。ただし、1 回の実行でもミリ秒ごとに新しいログ ファイルが作成されますが、これは、最もまれな状況を除いて望ましくない可能性があります。
キャッシュされたレイアウト レンダラー:
fileName="${basedir}/logs/log.${shortdate:cached=true}.log"
キャッシュされたレイアウト レンダラーは、最初のログ呼び出しで変数をキャッシュし、その後のエントリには常にその値を使用しますが、キャッシュは実行が完了するまでしか保持されません。shortdate や、実行ごとに変化することが保証されていないその他の変数を使用しても機能しません。使用したいファイル名と同じファイル名のログ ファイルが検索され、単に追加 (設定されている場合は削除) されます。これは私たちが望んでいるものではありません。
組み合わせ:
fileName="${basedir}/logs/log.${longdate:cached=true}.log"
これは、実行ごとに最初のログのミリ秒のタイムスタンプを取得してキャッシュし、実行が終了する (キャッシュをクリアする) まで常にそのログファイルを使用するためです。次に実行すると (同じミリ秒でない限り... 可能性は低いです!)、新しい値がキャッシュされ、新しいログ ファイルが作成されます (ただし、1 つだけです!)。