C# ログ出力
概要
ログ出力といっても、いろんな切り口で、いろんな角度から書き残せるとは思いますが、今回は文字列を引き渡すと、タイムスタンプ、呼び出し元クラス、呼び出し元メソッドを付加してログ出力するというものです。
タイトル通りの目的では、本格的なアプリではあまりやらないかも知れませんが、知っておくと役に立つ要素としては
- タイムスタンプ
- 呼び出し元クラス、呼び出し元メソッド の名前の取得の仕方
- stringのフォーマット出力
- StreamWriterをスレッドセーフに
- コンソールへの出力内容をファイルへ
このくらいの要素が含まれているかと思います。
詳細
タイムスタンプの取得部分は別の投稿を用意して、他のバリエーション等も取り上げたいところですが、ひとまずこれだけでも使うことが多いと思います。以下の例では、コンソールに出力しています。
public static void WriteLog(string message) { //タイムスタンプ取得 string timestamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); //呼び出し元メソッド名を取得 StackFrame callerFrame = new StackFrame(1); string className = callerFrame.GetMethod().ReflectedType.Name; string methodName = callerFrame.GetMethod().Name; string logMessage = string.Format("[{0}] {1,-32}: {2}", timestamp, className + "." + methodName, message); Console.WriteLine(logMessage); }
なんだ、コンソールに出しちゃうと結局ログ出力として使えねーじゃんって思われるかも知れませんが、そういうときは次のようにすれば、ファイル化することが出来ます。
System.IO.StreamWriter sw = new System.IO.StreamWriter("application.log"); sw.AutoFlush = true; System.IO.TextWriter tw = System.IO.TextWriter.Synchronized(sw); //StreamWiterをスレッドセーフに Console.SetOut(tw);
まぁ、何のことはない、コンソールはSetOut経由でStreamWriterが指定できるのでそれを使っているだけです。
ReleaseでBuildしたらこのパスでファイル化されて、普段Debugしているときはコンソールに出るなんて工夫もありかも知れませんね。
さいごに
きっと、本格的に使うのであれば、メッセージそのものはカタログ化しておき、その用意されたフォーマットに可変値だけを渡すといったこともあるでしょう。まぁ、今回は概要に書いたことが目的なので、あしからず。