読者です 読者をやめる 読者になる 読者になる

redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

.NETでログファイルのローテーションに日付を使用する

current.log
archive_20150524.log
archive_20150523.log

当日は日付なしのファイル名で、過去ファイルには日付がつくようなログローテーションを行う方法を調べました。 例えば、2015年5月25日の時点だと上記のようになっています。

NLogを使用します。対象バージョンは3以降です。そしていきなり設定ファイルを公開します。

NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="File" name="f" fileName="${basedir}/logs/current.log"
            layout="${longdate} ${uppercase:${level}} ${message}"
            archiveEvery="Day"
            archiveFileName="${basedir}/logs/archive_{#}.log"
            archiveNumbering="Date"
            archiveDateFormat="yyyyMMdd"
            maxArchiveFiles="3"/>
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="f" />
  </rules>
</nlog>

ここで重要なのは、archiveFileNameとarchiveEveryとarchiveNumbering、archiveDateFormatです。

archiveFileNameが過去ログの保存ファイル名で、archiveEveryはローテーションを行うタイミング(ここでは日ごと)、archiveNumberingは過去ログファイル名につける名前の規則(日付形式)、archiveDateFormatは「archiveNumbering=Date」の時に日付の書式を指定します。 さらにmaxArchiveFilesを指定すると、指定した数より古い過去ファイルは削除してくれます。

ちなみに、ログ出力の実行は以下のように行います。

class Program
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        logger.Info("TEST");
    }
}

今回はC#.NETで試してみましたが、VB.NETでも動くようです。

使用環境

Windows 8.1 64bit

Visual Studio 2013 Professional

NLog 3.2.1

NLog.Config 3.2.1

NLog.Extended 3.2.1

NLog.Schema 3.2.1