2010-12-07 4 views
25

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

// 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"); 

今質問します。あなたにはたくさんのクラスがあるいくつかのアセンブリを持つ大きなプロジェクトがあります。クラスにまたがって機能する特定のビットをトレースしたいとします。明らかな考え方は、特定のTraceSourceを作成する必要があるということです。

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

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

答えて

32

* 1。 TraceSourceを使用する各クラスにTraceSourceを定義するだけです。 TraceSourceを静的にして、定義したクラスのすべてのインスタンス間で共有することができます。「同じ」TraceSourceを必要とするすべてのクラス(型)間でインスタンスを共有する必要はありません。新しいTraceSource(TraceSource ts = new TraceSource( "somename");インスタンス)を削除するたびに、新しい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。複数のTraceSourcesを使用する1つの利点はということですトレースを細かく制御することができます。「TraceTes (またはまったくではない)、「TraceTestTwo」を介して、異なるレベル(または、まったくではない)で「t」を選択することができます。各TraceSourceを独自のTraceListenerに送信するか、またはすべてを同じTraceListenerに送信するか、または混合して一致させることができます。個々のTraceSourcesの設定を調整する機能と、Traceクラスの静的メソッドのみを使用するという制限を比較する。 「トレース」情報の場所(TraceListener(複数可))や「トレース」情報のレベルを設定できますが、TraceSourcesを使用するときと同じように、クラスごとまたは機能領域ごとのレベルを制御することはできません。最後に、複数のTraceSourcesのもう1つのメリットは、出力で得ることができる「フリー」なコンテキスト情報です。デフォルトで(またはオプションで覚えていない)、TraceListenerはメッセージを記録したTraceSourceの名前を記録します。だから、あなたはアウトプット内のその行を見ることができ、コールサイトに文脈情報のログを置かなくても、それが来たクラスや機能領域を知ることができます。上のコード例では、クラスAおよびBからのトレース出力には "TraceTest"というタグが付けられ、クラスBからのトレース出力には "TraceTestTwo"というタグが付けられます。

以下のようなリンクボンバードメントを許してください。しかし、過去にTraceSourceとSystem.Diagnosticsについてかなり良い情報を投稿しました。

あなたがTraceSourceのを使用しようとしている場合は、この中で言及したライブラリを使用することを検討SO log4netの/ NLogのようなあなたの出力をフォーマットするためのポスト:

Does the .Net TraceSource/TraceListener framework have something similar to log4net's Formatters?

TraceSourceのを使用して詳細はthis postで私の答えを参照してください。 TraceSourceの経験をどのように向上させるかについてのアイデアがあります。TraceSourceの上

さらに詳しい情報:TraceSourceの上Add Trace methods to System.Diagnostics.TraceListener

さらに詳しい情報:TraceSourceの上System.Diagnostics.Debug namespace vs Other logging solutions (log4net, MS Enterprise Library, etc.)

詳細情報:それは複数のスレッドを取る際には、いくつかのtracesourcesを使用してTurning tracing off via app.config

+9

が良くありません。 TraceSourceメソッドは、ロック機構を使用するスレッドセーフです。スレッド間で1つのTraceSourceインスタンスを共有すると、スレッドセーフな動作が保証されます。複数のTraceSourceインスタンスを使用すると、異なる動作が発生します。それでもスレッドセーフですが、スレッドセーフはlistnerレベルになります。つまり、2つのスレッドが同じファイルを同時にトレースすると、元のファイルがロックされているため、guid-prefixedファイルコピーが取得されます。 –

+3

私はTraceSourceを実動コードではあまり使用していませんが、マルチスレッドコードではそれほど使用していません。ここには、投稿者がUseGlobalLockフラグの使用について説明しているブログ投稿へのリンクがあります。あなたはすでにそれを見ているかもしれませんし、あなたがそれが特に役に立つと思われるかもしれません。彼のブログには、System.Diagnosticsを使ってトレースを使用する方法についてのいくつかの記事があります。 http://www.neovolve.com/post/2009/01/08/Disable-Trace-UseGlobalLock-For-Better-Tracing-Performance.aspx – wageoghe

+0

@wageoghe、リンクが壊れています。 – Spirit

関連する問題