もくじ
やりたいこと
C#でアプリをつくっているときに、もう何でもいいから今すぐ簡単にログを出力させて、それを見たい。
例えば、VisualStudioでデバッグ実行がしたくてもできないけど、どの経路を通ったかを知りたくて、でもMessageBoxは出したくない、というとき。
やり方
下記のような簡単なログ用クラスを貼り付けて使用する。
public static class LogOnDesktop
のクラスがそれ。
終わったら、クラスごと消す。
namespace ConsoleApp1
{
internal class Program
{
static async Task Main(string[] args)
{
var t1 = Task.Run(() => log("thread1"));
var t2 = Task.Run(() => log("thread2"));
await Task.WhenAll(t1, t2);
}
static void log(string str)
{
for (int i = 0; i < 10; i++)
{
LogOnDesktop.WriteLine($"{str} {i}");
}
}
}
public static class LogOnDesktop
{
private static object lockObj = new object();
private static string logPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\mylog.log";
public static void WriteLine(string line)
{
lock (lockObj)
{
var now = DateTime.Now.ToString("HH:mm:ss.fff");
var thid = Thread.CurrentThread.ManagedThreadId;
File.AppendAllText(logPath, $"{now} {thid} {line}{Environment.NewLine}");
}
}
}
}
で、このクラスのWriteLogToDesktopLogFile()
を実行するとデスクトップにlog.log
ファイルができるが、そいつを以前書いた「Tailっぽくログを監視できるバッチファイル」を使ってリアルタイムで見てやれば、簡易的にログ監視体制の完成。
もしログに、ログを残したメソッド名を記録したければ、WriteLogToDesktopLogFile()
を呼ぶときに下記のようにしてやればよい。
// using System.Reflection;
LogOnDesktop.WriteLogToDesktopLogFile(MethodBase.GetCurrentMethod().Name);
追記
下記ページのような方法もよさそう。