log4netでログをローテーションしたい!!!!

2021-02-03

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には他にも設定可能です。

Once1回実行毎にローリングします
Size指定したファイルサイズでローリングします
Date指定した日時毎にローリングします
Compositeファイルサイズと日時、片方の条件を満たしたときファイルをローリングします
log4net公式SDKリファレンスを雑に翻訳

そもそもlog4netにファイルのローテーション機能ありますけど

log4netの公式SDKリファレンスを見ていくと次のようなクラスがあります。

MaxSizeRollBackups

log4netの公式SDKリファレンス

詳細を読んでいくと、うんうんそれっぽい…。ただ、それには騙されてはいけません。
同じページの下の方に注意書きがあります。

Caution
A maximum number of backup files when rolling on date/time boundaries is not supported.

log4netの公式SDKリファレンス

まあ、要するに、日付でローリングする際はlog4netではファイル削除をサポートしてませんよーというお話です。サイズでローリングなら上記のクラスに値を格納すれば解決!なのですが、日付でローリングしたい場合は自分で「5ファイル以上になったらファイルを削除する!」みたいな処理を実装するしかありません。

まとめ

log4netには日付毎に出力するログファイルを変えることができますが、その場合log4netの機能を使って自動的にログファイルを削除することはできません!残念…。
たしかに要件によって更新日時順でソートした結果で消していきたいのか、ログファイル名をベースとして消していきたいのか条件が異なってくるので自分で実装した方が安全そうです。

Log4Netについて興味がある方は

こちらに当サイトのLog4Netについての記事をまとめました!

当サイトのlog4netの記事一覧です
mikan-tech.info