C#でちょっとローテーションログを使いたいとき。

# C#でちょっとローテーションログを使いたいとき

Warn とか Info とかめんどくさい……、出力したもの全部ログに残してくれればいい……、
そんな　ずぼら　にやりたいとき、

```C#
using System;

// ↓この角括弧が何やってるか分けわかんなければ消してくれだぜ。
[assembly: CLSCompliant(true)]
namespace LogRotationPractice
{
    using System.Diagnostics;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Threading;

    // [ソリューション エクスプローラー]のプロジェクトの下の[参照]を右クリック、
    // [参照の追加(R)...]をクリック。[アセンブリ] - [フレームワーク] と進み、
    // Microsoft.VisualBasic をチェックしてください。
    using VBFileIO = Microsoft.VisualBasic.FileIO;
    using VBLogging = Microsoft.VisualBasic.Logging;

    /// <summary>
    /// プログラム。
    /// </summary>
    public static class Program
    {
        /// <summary>
        /// エントリーポイント。
        /// </summary>
        public static void Main()
        {
            /*
             * 参考。
             * https://dobon.net/vb/dotnet/programing/myapplicationlog.html
             * https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.logging.filelogtracelistener?redirectedfrom=MSDN&view=netframework-4.7.2
             * https://dobon.net/vb/dotnet/file/filecopy.html
             * https://dobon.net/vb/dotnet/programing/tracelisteners.html
             */
            using (var fileLogTraceListener = new VBLogging.FileLogTraceListener("LogFile"))
            {
                // ディレクトリが無くても、自動で作成する。
                var logDirectory = "./logs";

                // 最初から設定されているリスナーを削除する。
                Trace.Listeners.Remove("Default");

                // ストリームを閉じるのを待たずに、書き込みを進める。
                fileLogTraceListener.AutoFlush = true;
                fileLogTraceListener.Location = VBLogging.LogFileLocation.Custom;
                fileLogTraceListener.CustomLocation = logDirectory;
                fileLogTraceListener.BaseFileName = "rotate";
                fileLogTraceListener.LogFileCreationSchedule = VBLogging.LogFileCreationScheduleOption.Daily;
                Trace.Listeners.Add(fileLogTraceListener);

                // コンソールにも出力するなら。
                Trace.Listeners.Add(new ConsoleTraceListener());

                // 古いログを削除する。
                if (Directory.Exists(logDirectory))
                {
                    var regex = new Regex(@"rotate-(\d{4})-(\d{2})-(\d{2}).*\.log");

                    // 10日前までのファイルは残す。
                    var tenDaysAgo = DateTime.Today.AddDays(-10);

                    string[] files = Directory.GetFiles(
                        logDirectory,
                        "rotate-*.log",
                        SearchOption.TopDirectoryOnly);

                    foreach (var file in files)
                    {
                        Trace.WriteLine("File: " + file);
                        var match = regex.Match(file);
                        if (match.Success)
                        {
                            var fileNameDate = new DateTime(
                                int.Parse(match.Groups[1].Value),
                                int.Parse(match.Groups[2].Value),
                                int.Parse(match.Groups[3].Value));
                            if (fileNameDate < tenDaysAgo)
                            {
                                // 完全に削除したいなら。
                                // File.Delete(file);
                                // ゴミ箱に入れたいなら。
                                VBFileIO.FileSystem.DeleteFile(
                                    file,
                                    VBFileIO.UIOption.OnlyErrorDialogs,
                                    VBFileIO.RecycleOption.SendToRecycleBin);

                                Trace.WriteLine("Removed: " + file);
                            }
                        }
                    }
                }

                // ログを出力します。
                Trace.WriteLine("Hello, world!");
                Trace.WriteLine("Hello, Japan!");
                Trace.WriteLine("Hello, Tokyo!");

                Thread.Sleep(15000);
            }
        }
    }
}
```

こんな感じにやってしまう。

参考。

* [My.Application.Logを使用してトレースする、ログに書き込む](https://dobon.net/vb/dotnet/programing/myapplicationlog.html)
* [FileLogTraceListener Class](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.logging.filelogtracelistener?redirectedfrom=MSDN&view=netframework-4.7.2)
* [ファイルをコピー、移動（名前の変更）、削除する](https://dobon.net/vb/dotnet/file/filecopy.html)
* [TraceやDebugのWriteメソッドでファイルに出力する](https://dobon.net/vb/dotnet/programing/tracelisteners.html)