.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

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:固定名にしなくていいかもしれないけど、訳がわからなくなりそうな予感。

. .