Development

TraceListener を実装して Debug.WriteLine/Print の出力先を変更/追加する方法

Debug.WriteLine や Debug.Print の出力先を追加する方法です。出力先を Twitter にした例は、こちら。[Visual Studio] Debug.WriteLine でツイートできる NuGet パッケージを作った

コード中の Debug.WriteLine の記述などはそのままに、ログの出力先を追加したり、標準では用意されていないところ(特定のデータベースなど)に出力したりできます。

カスタム TraceListener クラスの作成

TraceListener クラス (System.Diagnostics) を継承したクラスを作ります。

Write と WriteLine メソッドを最低限実装すればよいのでお手軽です。データベースなど所望の場所に出力しましょう。標準でいくつか TraceListener を継承したクラスがあるので、まずそれも確認しておくとよいです。

C# サンプル

FooTraceListener.cs
public class FooTraceListener : TraceListener
{
    public override void Write(string message)
    {
        // どこかに出力する
    }

    public override void WriteLine(string message)
    {
        // どこかに出力する
    }
}

Visual Basic (VB.NET) サンプル

FooTraceListener.vb
Public Class FooTraceListener
   Inherits TraceListener

   Public Overrides Sub Write(message As String)
       ' どこかに出力する
   End Sub

   Public Overrides Sub WriteLine(message As String)
       ' どこかに出力する
   End Sub
End Class

出力先の追加(使い方)

コードに記述

作った カスタム TraceListner クラスは、次のように Trace.Listeners.Add で追加して使います。

Program.cs
static void Main(string[] args)
{
    Trace.Listeners.Add(new FooTraceListener());
    Debug.WriteLine("こんばんは");
}

App.config に記述

コードに追加せず、App.config や Web.config に、次のように <system.diagnostics> に値を追加し、記述しても使えます。

app.config
<system.diagnostics>
<trace>
  <listeners>
    <add name="myListener" type="Foo.Diagnostics.FooTraceListener,FooTraceListener" />
  </listeners>
</trace>
</system.diagnostics>

Foo.Diagnostics.FooTraceListener は、名前空間を含むクラス名、その後の FooTraceListener は、アセンブリ名(DLL の名前)です。適宜、置き換えてください。

また、.config ファイルに TraceListener 用のパラメーターを持たせることができます。「独自の TraceListener 実装でそのリスナー独自の構成パラメータを指定するには : @jsakamoto」が、参考になります。