質問
1つのアプリケーションがすべてのアクティビティデータを1つのログファイルに記述している場合、複数のTracesSourceを使用することはありますか?コードに複数のトレソシュールが必要になる場合の使用法に興味があります。
解決
TracesSourcesを使用する良い出発点については、他の質問に対するこれらの回答を参照してください。
.NET 2010トレースとapp.configを理解できません
複数のクラスを持っているときはいつでも、複数のトレースソーシュを持っていることを検討するかもしれません。
複数のTracesSourceを持つことの利点の1つは、ロギングを制御できる粒度が増加することです。たとえば、すべてのクラスで別のTracesSourceを使用する場合、クラスレベルまでのログダウンを制御できます。 1つの(またはそれ以上)特定のクラスをオンにして、他のすべてのクラスをオフにすることができます。
これは、nlogとlog4netのユーザーにとって一般的なパターンです。これらのロギングプラットフォームを使用したクラスの典型的な初期化は、次のようになります。
public class A
{
//NLog example
private static Logger logger = LogManager.GetCurrentClassLogger();
public F()
{
logger.Info("Inside F");
}
}
この例では、クラスAのロガーは、クラスの完全な資格のある名前にちなんで名付けられました(NLOGはGetCurrentClassLogger()でハードワークを行います)。
TracesSourceで同様のことをするには、次のようなことをします。
public class A
{
private static TraceSource ts = new TraceSource(System.Reflection.GetCurrentMethod().DeclaringType.ToString();
public F()
{
ts.Information("Inside F");
}
}
すべてのクラスでこれを行った場合、クラスごとにロギングを簡単に制御できます。
このパターンがlog4netやnlogと同じようにTracesSourceで一般的であるかどうかはわかりません。 TracesSourceのユーザーが機能領域ごとにトレースソーケを取得するのを見ることができると思います。
そのため、アプリを「読み取り」、「プロセス」、「書き込み」機能(またはあなたにとって意味のあるもの)に分割することができます。その場合、使用されている機能領域に基づいて、クラスで適切なトレースソーセを取得できます。
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");
}
}
等々。
これで、「読み取り」のためにログオンし、他のすべての機能領域のオフをオフにすることができます(または、「読み取り」のための冗長ログをオンにし、他のすべての冗長ログを少なくします)。
さらに、TraceListenersのオプションの1つは、TracesSource名を出力することです。したがって、出力では、ロギングを理解する方が簡単になります。これを選択した場合、特定の機能領域(または特定のTracesSource)から生成されるすべてのログメッセージを比較的簡単に見つけることができます。
良い名前空間命名規則がある場合は、名前空間階層の一部のノードに基づいて、またはクラスが住んでいるアセンブリに基づいて、各クラスのTracesSourceを取得することを検討することもできます。あなたのためのその情報。
TracesSourcesを見ているので、CodePlexでこのプロジェクトを見ることをお勧めします。
http://ukadcdiagnostics.codeplex.com/
これは、log4netとnlogでできることと同様の方法でログ出力をフォーマットできるようにする素晴らしいプロジェクト(TracesSourceに基づいています)です。
また、CastleのTracesSourceの周りに構築されたこの伐採ラッパーを見てみることをお勧めします。
https://github.com/castleproject/castle.core/blob/master/src/castle.core/core/logging/tracelogger.cs
彼らがした興味深いことは、名前を追跡するために階層を提供することです。私は過去に似たようなものを実装しました。それはかなりうまく機能します。
この質問の私の答えは、TracesSourceの階層がどのように有益であるかについてのアイデアを提供します。
幸運を!