【C#】【デバッグ】独自のLoggerクラス作成する

独自のLoggerクラス作成する

http://blogs.yahoo.co.jp/dk521123/20151544.html
で、試しに作ったが、
http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debugonfile.html
で乗ってた「DefaultTraceListener」を使用した方がよさそうなので、いっちょ作ってみる。

# 本当は、フレームワーク(log4netとか)で、実装したかったがVS2010対応してそうにないので。
#  (できた! ↓ )
http://blogs.yahoo.co.jp/dk521123/20264938.html

サンプル

独自のLoggerクラス

public class Logger
{
    public const string DEFAULT_DAY_FORMAT_FOR_LOG_FILENAME = "yyyyMMdd";
    public const string DEFAULT_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
    public const string DEFAULT_LOG_FILE_NAME = "logger_{0}.log";

    string dateFormate = DEFAULT_DATE_FORMAT;

    public Logger()
        : this(string.Format(
            DEFAULT_LOG_FILE_NAME, System.DateTime.Now.ToString(
            DEFAULT_DAY_FORMAT_FOR_LOG_FILENAME))
        , System.IO.Path.GetDirectoryName(
        System.Windows.Forms.Application.ExecutablePath)
        , DEFAULT_DATE_FORMAT) 
    {
    }

    public Logger(string logFileName, string path, string date)
    {
        System.Diagnostics.DefaultTraceListener dtl
            = (System.Diagnostics.DefaultTraceListener)
            System.Diagnostics.Debug.Listeners["Default"];
        dtl.LogFileName = System.IO.Path.Combine(
            path, logFileName);
        this.dateFormate = date;
    }

    public void Write(string message)
    {
        System.Diagnostics.StackTrace stackTrace
            = new System.Diagnostics.StackTrace(true);

        string msg = string.Format("{0} [{1}.{2}() : Line {3}] : {4}"
            , System.DateTime.Now.ToString(this.dateFormate)
            , stackTrace.GetFrame(1).GetMethod().ReflectedType.FullName
            , stackTrace.GetFrame(1).GetMethod().Name
            , stackTrace.GetFrame(1).GetFileLineNumber().ToString()
            , message
            );

        System.Diagnostics.Debug.WriteLine(msg);
    }
}

呼び出し例

private void button1_Click(object sender, EventArgs e)
{
    Logger log = new Logger();

    log.Write("Start");
    log.Write("End");
}

出力例:

2010/11/14 22:32:00 [Test.Form1.button1_Click() : Line 0] : Start
2010/11/14 22:32:00 [Test.Form1.button1_Click() : Line 0] : End

問題点

(1) 文字コードUTF-8であること。詳細は、以下、参照。
http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debugonfile.html
(2) ソースの行番号がうまく表示してくれないこと(VS2010環境)
=> 『StackTrace(true)』と『GetFileLineNumber()』で解決

参考資料

http://dobon.net/vb/dotnet/programing/tracelisteners.html
http://homepage2.nifty.com/nonnon/SoftSample/CS.NET/SampleTraceLog.html