log4netには「RollingFileAppender」というクラスがあります。
Log4netの設定ファイルで割と頻出するので見覚えある文字列だとは思います。今回はRollingFileAppenderを使って出力したログをローテーション、つまり期間を過ぎたファイルを削除していく方法を探していきます。
RollingFileAppenderとは
サイズや日付で出力するログファイルを変更できる便利なアペンダーです。
具体的にどうやって設定するのか
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="testlog" type="log4net.Appender.RollingFileAppender">
<Encoding value="utf-8" />
<appendToFile value="true" />
<StaticLogFileName value="false" />
<rollingStyle value="Date" />
<file value="log" />
<DatePattern value='yyyyMMdd".log"' />
<lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="Error" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern value="%date [%-5level] - %message%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="testlog" />
</root>
</log4net>
</configuration>
上の設定ファイルの「rollingStyle」の部分がローリング設定をしている箇所です。上の設定ファイルは「Date」、つまり日付単位でローリングしていますが、log4netには他にも設定可能です。
Once | 1回実行毎にローリングします |
Size | 指定したファイルサイズでローリングします |
Date | 指定した日時毎にローリングします |
Composite | ファイルサイズと日時、片方の条件を満たしたときファイルをローリングします |
そもそもlog4netにファイルのローテーション機能ありますけど
log4netの公式SDKリファレンスを見ていくと次のようなクラスがあります。
MaxSizeRollBackups
log4netの公式SDKリファレンス
詳細を読んでいくと、うんうんそれっぽい…。ただ、それには騙されてはいけません。
同じページの下の方に注意書きがあります。
Caution
log4netの公式SDKリファレンス
A maximum number of backup files when rolling on date/time boundaries is not supported.
まあ、要するに、日付でローリングする際はlog4netではファイル削除をサポートしてませんよーというお話です。サイズでローリングなら上記のクラスに値を格納すれば解決!なのですが、日付でローリングしたい場合は自分で「5ファイル以上になったらファイルを削除する!」みたいな処理を実装するしかありません。
まとめ
log4netには日付毎に出力するログファイルを変えることができますが、その場合log4netの機能を使って自動的にログファイルを削除することはできません!残念…。
たしかに要件によって更新日時順でソートした結果で消していきたいのか、ログファイル名をベースとして消していきたいのか条件が異なってくるので自分で実装した方が安全そうです。
Log4Netについて興味がある方は
こちらに当サイトのLog4Netについての記事をまとめました!