IsolatedStorageTargetでログローテーションする

前回までのエントリでIsolatedStorageにログを出力できるようにはなったが、単一のファイルをログを出力し続けるとサイズがどんどんと膨らんでいくことになるので、なんらかのログのアーカイブ戦略を立てなくてはならない。

ログのアーカイブとローテーション

ログのアーカイブはログファイルのサイズに上限を決めておき、その上限を超えた書き込みが発生したらそれまでの内容を別なファイルにアーカイブすることであり、ローテーションとはアーカイブするファイルの世代数(アーカイブ数)を予め決めておき、それを超えたら元の最初のファイルを上書きするように運用することを言う。


以上の機能を全て実装するのは結構面倒なのだが、幸いにもNLogにはこの機能は既に組込まれておりFileTargetクラスで実装されている。

であれば今回起こしたIsolatedStorageTargetクラスの継承元をTargetWithLayoutではなく、FileTragetクラス帰れば良さそうな気もするのだが、そうは問屋が卸さない。現在のNLogのバージョンにおけるFileTragetクラスは通常ファイルシステムを扱うプラットホーム用に最適化されているようで、特にWindows Phone 7条件でコンパイルしようとすると殆どの実装が無効となってしまうのである。

NLog.Targets.FileTarget.cs
#if !SILVERLIGHT2 && !SILVERLIGHT3 && !WINDOWS_PHONE → 以降はWindows Phone プラットホームではコンパイルされない

namespace NLog.Targets
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    :
    [Target("File")]
    public class FileTarget : TargetWithLayoutHeaderAndFooter, ICreateFileParameters
    {
        private readonly Dictionary<string, DateTime> initializedFiles = new Dictionary<string, DateTime>();
        private LineEndingMode lineEndingMode = LineEndingMode.Default;
        private IFileAppenderFactory appenderFactory;
        :

なので、やることはこのFileTargetクラスからログのアーカイブとローテーションの機能を抜き出してIsolatedStorageTargetクラスにポートすることである。