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);
}
}
}
}
こんな感じにやってしまう。
参考。