web-dev-qa-db-ja.com

クラス間でTraceSourceを使用する方法

私は最近、 TraceSource に関するドキュメントを研究していました。 Microsiftによると、TraceSourceは新しい方法であり、古いTraceクラスの代わりに使用する必要があります。

// create single TraceSource instance to be used for logging
static TraceSource ts = new TraceSource("TraceTest");

// somewhere in the code
ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found");

今私の質問。たくさんのクラスがあるいくつかのアセンブリを持つ大規模なプロジェクトがあります。クラス全体に分散している特定の機能をトレースしたいとします。明らかなアイデアは、1つの特定のTraceSourceを作成する必要があるということです。

1)Tracesourceを使用するには、最初にインスタンスを作成する必要があります。 MSは、このインスタンスをさまざまなクラスまたはアセンブリ間で共有することについてどのように考えていますか?静的シングルトンプロパティを持つダミークラスを1つ作成する必要がありますか?その場合は何をしていますか。

2)なぜTraceSourceインスタンスが必要なのですか?すべてのプロパティは、構成ファイルに記述されています。 Traceクラスに基づく古いロジックは、インスタンスを必要とせず、静的メソッドのみを操作する方法を提供していました。

27
Captain Comic

* 1。 TraceSourceを使用する各クラスで定義するだけです。 TraceSourceを静的にして、定義したクラスのすべてのインスタンス間で共有することができます。「同じ」TraceSourceを必要とするすべてのクラス(タイプ)間でインスタンスを共有する必要はありません。新しいTraceSource(TraceSource ts = new TraceSource( "somename");インスタンスをクリアするたびに、新しいTraceSourceオブジェクトを取得しますが、同じ構成情報を参照します。したがって、いくつかのクラスのそれぞれで新しいTraceSourceを作成すると、それぞれに同じ名前を使用すると、TraceSourceの異なるインスタンスが取得されますが、それらはすべて同じように構成されます。つまり、クラス間でTraceSourceインスタンスを共有しようとする必要はありません。また、作成する必要もありません。静的シングルトンを持つダミークラス。以下の例を参照してください。ここから、TraceSourcesの操作方法を説明するリンクをさらにいくつか含めましたSO。

//
// In this example, tracing in classes A and B is controlled by the "TraceTest" TraceSource
// in the app.config file.  Tracing in class C is controlled by the "TraceTestTwo"
// TraceSource in the app.config.
//
// In addition to using different TraceSource names, you can also use SourceSwitches 
// (in the app.config).  See some examples of app.config in the
// "turning-tracing-off-via-app-config" link below.
//

public class A
{
  private static readonly TraceSource ts = new TraceSource("TraceTest");

  public void DoSomething()
  {
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found");   
  }
}

public class B
{
  //
  //Use the same config info for TraceTest in this class
  //It's ok to use a different instance of TraceSource, but with the same name,
  //in this class, the new instance will be configured based on the params in the
  //app.config file.
  //
  private static readonly TraceSource ts = new TraceSource("TraceTest");

  public void DoSomething()
  {
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found");   
  }
}

public class C
{
  //
  //Use a different TraceSource in this class.
  //
  private static readonly TraceSource ts = new TraceSource("TraceTestTwo");

  public void DoSomething()
  {
    ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found");   
  }
}

* 2。複数のTraceSourceを使用する利点の1つは、トレースをよりきめ細かく制御できることです。あるレベルの「TraceTest」を介して(またはまったくトレースしない)、別のレベルの「TraceTestTwo」を介して(またはまったくトレースしない)トレースできます。各TraceSourceを独自のTraceListenerに送信するか、すべてを同じTraceListenerに送信するか、または組み合わせて送信することができます。個々のTraceSourceの構成を調整する機能を、Traceクラスで静的メソッドのみを使用するという制限と比較してください。 「トレース」情報の送信先(TraceListener(s))または「トレース」情報のレベルを構成できますが、TraceSourcesを使用する場合のように、クラスごとまたは機能領域ごとのレベルを制御することはできません。最後に、複数のTraceSourceのもう1つの利点は、出力で取得できる「無料の」コンテキスト情報です。デフォルトでは(またはオプションで、思い出せません)、TraceListenerはメッセージをログに記録したTraceSourceの名前をログに記録します。したがって、出力のその行を見て、呼び出しサイトにコンテキスト情報のログを配置しなくても、クラスまたは機能領域がどこから来たのかを知ることができます。上記のコード例では、クラスAおよびBからのトレース出力は「TraceTest」でタグ付けされ、クラスBからのトレース出力は「TraceTestTwo」でタグ付けされます。

以下のリンク爆撃を許してください、しかし私は過去にTraceSourceとSystem.Diagnosticsについていくつかのかなり良い情報を投稿しました(私がそう言うなら!)。

TraceSourceを使用する場合は、log4net/NLogのように出力をフォーマットするために、このSO post:

。Net TraceSource/TraceListenerフレームワークにはlog4netのフォーマッターに似たものがありますか?

TraceSourceの使用に関する詳細と、「TraceSourceエクスペリエンス」を改善する方法に関するいくつかのアイデアについては、 この投稿 の私の回答を参照してください。

TraceSourceの詳細: System.Diagnostics.TraceListenerにTraceメソッドを追加

TraceSourceの詳細: System.Diagnostics.Debug名前空間と他のログソリューション(log4net、MS Enterprise Libraryなど)

TraceSourceの詳細: app.configを介してトレースをオフにする

35
wageoghe