25

タイトルが示すように、アプリケーションの実行ごとに新しいログ ファイルを作成するにはどうすればよいですか? 分/時間/などの方法を知っています。アプリ用ではありません。走る

私が今持っているものがあります:

target name="Debug" archiveEvery="Hour"
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4" 
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt" 
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception}
${exception:format=stacktrace}"

しかし、実際には毎時間アーカイブする必要はありません。アプリを実行するたびにアーカイブしたいのです。古いフォーラムで見つけたものがありますが、Cached_layout_renderer の使い方がわかりません

4

4 に答える 4

44

私は自分でこの問題に遭遇しましたが、それを理解するのに長い時間がかかりました. 私が見つけた答えのほとんどは、ソリューションの一部しかなく、それがどのように/なぜ機能するかを説明していません...これにより、ユースケースがわずかに異なる場合、適応が難しくなります。

<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 つだけです!)。

于 2015-06-22T23:34:32.593 に答える
21

NLog の FileTarget サポートは、プロパティ archiveOldFileOnStartup ( NLog-3-2-0 Release ) になりました。

archiveOldFileOnStartup="true"

これにはいくつかの問題がある可能性がありますが、同時に実行されているアプリのインスタンスが 1 つだけの場合は、目的の動作が得られるはずです。

于 2015-12-03T10:33:31.390 に答える
5

キャッシュ レイアウト レンダラーの使用方法の例については、https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.csを参照してください。

基本的には、次のように使用できます。

${cached:${variable}:cached=true}
于 2013-06-24T09:38:55.857 に答える