NLog の archiveNumbering="Rolling" を使う
NLogでログをファイル出力の設定をする際、単純に日付ローテートを使用することが多いのですが、アーカイブという属性がありましたので挙動を調べてみます。
注意
NLogでいうところのアーカイブとは退避のことを指しており、圧縮のことではありません。
NLog.config
設定はこんな感じ(該当ブロックのみ抜粋)
<target name="archive_file_rolling" xsi:type="File"
fileName="${basedir}/logs/archive_rolling.log"
layout="${verbose}"
archiveFileName="${basedir}/logs/archives/archive_rolling.{#}.log"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
/>
簡単に説明すると以下の通り。
- 「logs」フォルダに「archive_rolling.log」という名前で出力する
- 「logs/archivbes」フォルダの「archive_rolling.{#}.log」ファイル書式でアーカイブしてください
- アーカイブは日単位です
- アーカイブファイル名はローリング形式でナンバリングする
- アーカイブは7日間
※詳細はFile target · NLog/NLog Wiki · GitHub参照
私はよく
fileName="${basedir}/logs/${shortdate}.log"
を指定して、直日付別のログを書いていましたが、アーカイブするときは固定名を指定するのがポイントでしょうか。 *1
実行
初回
'archive_rolling.log
2014-12-13 09:14:36.7296 | INFO | Start
2014-12-13 09:14:36.7764 | INFO | End
- logsには「archive_rolling.log」ファイルが出力されている。(12/13日分が入っている)
- logs/archivesフォルダは作成されていない。
2日目
'archive_rolling.log
2014-12-14 09:16:00.9150 | INFO | Start
2014-12-14 09:16:01.0086 | INFO | End
'archive_rolling.0.log
2014-12-13 09:14:36.7296 | INFO | Start
2014-12-13 09:14:36.7764 | INFO | End
- 「archive_rolling.log」ファイルには「12/14日分」のログだけが入っている。12/13日分のものはなくなっている。
- logs/archivesフォルダには「archive_rolling.0.log」というファイルができており、12/13日分のログが入っている。
3日目
'archive_rolling.0.log
2014-12-14 09:16:00.9150 | INFO | Start
2014-12-14 09:16:01.0086 | INFO | End
'archive_rolling.1.log
2014-12-13 09:14:36.7296 | INFO | Start
2014-12-13 09:14:36.7764 | INFO | End
- 「archive_rolling.log」ファイルには「12/15日分」のログだけが入っている。12/14日分のものはなくなっている。
- logs/archivesフォルダには「archive_rolling.1.log」というファイルができており、「12/13日分」のログが入っている。 つまり、「archive_rolling.0.log」のファイルは「archive_rolling.1.log」にリネームされた感じ。
- 「archive_rolling.0.log」のファイルを開くと、12/14日分のログが入っている。
9日目
- 12/21日分のログが出力されたとき、12/13のログはなくなる。
- 現在日を除いた日数(maxArchiveFiles)分、アーカイブは残るが、超えると削除。
アーカイブファイルと中身の状態は以下のようになっている。
archive_rolling.0.log 12/20
archive_rolling.1.log 12/19
archive_rolling.2.log 12/18
archive_rolling.3.log 12/17
archive_rolling.4.log 12/16
archive_rolling.5.log 12/15
archive_rolling.6.log 12/14
結論
archiveNumbering="Rolling" を指定すると、ところてん方式でアーカイブに押し出す。そして直近のものから「0」、「1」~「N」とナンバリングされるってことですね。(あ、wikiにそう書いてある…)
用途
長期保管が必要ない場合はarchiveNumbering="Rolling"
使うとよさそうですね。勝手に削除してくれますから。
ちなみに長期保管が必要かつ、アーカイブ(退避)はしたいということであれば、archiveNumbering="Rolling"
ではなく、archiveNumbering="Date"
を使うといいです。
具体的にはこんな感じ。
<target name="archive_file_weekday" xsi:type="File"
fileName="${basedir}/logs/current.log"
layout="${verbose}"
archiveFileName="${basedir}/logs/archives/archive_${shortdate}.log"
archiveEvery="Day"
archiveNumbering="Date"
maxArchiveFiles="3"
/>
archiveNumbering="Date"
と、archiveFileName="${basedir}/logs/archives/archive_${shortdate}.log"
がミソ。
maxArchiveFilesは無制限にはできなさそうなので、適当に数字を入れてください。長期保管の場合、夜間に「圧縮処理+さらに退避処理」すると思いますから未圧縮の状態のファイルは1-2日あれば十分でしょう。(といって圧縮する前にNLogに消されるとこわいから余裕は持っといてね)
*1:固定名にしなくていいかもしれないけど、訳がわからなくなりそうな予感。