2011-02-01 5 views
5

1つのアプリケーションがすべてのアクティビティデータを1つのログファイルに書き込んでいる場合、複数のTraceSourceを使用することはありますか?私はコード内に複数のTraceSourceが必要なユースケースについて興味があります。コードに複数のTraceSourceが必要なのはいつですか?

答えて

9

TraceSourcesを使用しての良い出発点のために他の質問にこれらの答えを参照してください。

can't understand .net 2010 tracing and app.config

How to use TraceSource across classes

私はいつでもあなたが(かもしれない)かもしれない1クラス以上のものを持っていると言うでしょう複数のTraceSourceを持つことを検討してください。

複数のTraceSourceを持つ利点の1つは、ログを制御できる粒度が増えることです。たとえば、すべてのクラスで異なるTraceSourceを使用する場合は、クラスレベルまでログを制御できます。 1つ(またはそれ以上)の特定のクラスをオンにし、他のクラスをすべてオフにすることができます。

これは、NLogとlog4netのユーザーにとって一般的なパターンです。これらのログのプラットフォームを使用して、クラスの典型的な初期化が次のようなものになります。この例では

public class A 
{ 
    //NLog example 
    private static Logger logger = LogManager.GetCurrentClassLogger(); 

    public F() 
    { 
    logger.Info("Inside F"); 
    } 
} 

を、クラスAのためのロガーは、(NLogはGetCurrentClassLogger(でハードワークを行います)クラスの完全修飾名にちなんで命名されました)。

TraceSourceのと似たような操作を行うには、あなたがこのような何かをするだろうが:あなたはすべてのクラスでこれをやった場合

public class A 
{ 
    private static TraceSource ts = new TraceSource(System.Reflection.GetCurrentMethod().DeclaringType.ToString(); 

    public F() 
    { 
    ts.Information("Inside F"); 
    } 
} 

、あなたは簡単にクラスでログインあなたをコントロールすることができます。

このパターンは、Log4netおよびNLogと同じようにTraceSourceでよくあることではありません。 TraceSourceのユーザーは機能分野別にTraceSourcesを取得することがよくあります。

アプリを「読み取り」、「処理」、「書き込み」の機能(またはあなたにとって意味のあるもの)に分けることができます。

public class FileReader 
{ 
    private static TraceSource ts = new TraceSource("Read"); 

    public F() 
    { 
    ts.Information("Hello from FileReader.F"); 
    } 
} 

public class NetworkReader 
{ 
    private static TraceSource ts = new TraceSource("Read"); 

    public F() 
    { 
    ts.Information("Hello from NetworkReader.F"); 
    } 
} 

などなど:その場合は、あなたは彼らが使用されている機能領域に基づいて、クラス内で適切なTraceSourceのを得ることができます。

これで、「読み取り」はログオンし、他の機能領域は「オフ」にしたり、「読み取り」の詳細ログを有効にしたり、その他の機能については冗長なログを有効にしたりすることができます。

また、TraceListenersのオプションの1つは、TraceSource名を出力することです。したがって、あなたの出力では、特定の機能領域(または特定のTraceSource)から生成されたすべてのロギングメッセージを比較的簡単に見つけることができるため、ロギングを理解するのが簡単になります。

ネームスペースの命名規則が良好であれば、名前空間階層のいくつかのノードに基づいて、またはクラスが存在するアセンブリに基づいて各クラスのTraceSourceを取得することも考えられます。その情報を取得するタイプ。

あなたがTraceSourcesを見ているので、私はCodePlexの時にこのプロジェクトを見てことをお勧めします:

http://ukadcdiagnostics.codeplex.com/

それはあなたがあなたのログ出力をフォーマットすることができます(TraceSourceのに基づいて)素敵なプロジェクトですlog4netとNLogを使ってできることと同様の方法で実行します。

また、CastleからTraceSourceを中心に構築されたこのロギングラッパーを見てみることをお勧めします。

https://github.com/castleproject/Castle.Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs

、彼らが行っていることは興味深い事はTraceSourceの名に階層を提供することです。私は過去に似たようなものを実装しました。それはかなりうまくいく。

What's the best approach to logging?

幸運:この問題の

私の答えは、TraceSourceの階層が有益であり得るかのアイデアを提供しています!

関連する問題