LoginSignup
3
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-15

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

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

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);
            }
        }
    }
}

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

参考。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4