プロじゃないのでコピペでコーディング!

四半世紀に迫ろうとするベテラン・コピペ・プログラマーが送るコピペの元。 張って動けば良し!動かなければなんで?そんな私をサポートするブログです。 ま、動けば良いと本人が思ってるなら、これでも良いんじゃね?って思ったら生暖かく見守って頂き、こりゃ目に余る!って思ったら、優しく教えてやってください。

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しているときはコンソールに出るなんて工夫もありかも知れませんね。


さいごに

きっと、本格的に使うのであれば、メッセージそのものはカタログ化しておき、その用意されたフォーマットに可変値だけを渡すといったこともあるでしょう。まぁ、今回は概要に書いたことが目的なので、あしからず。