1つのアプリケーションがすべてのアクティビティデータを1つのログファイルに書き込んでいる場合、複数のTraceSourceを使用することはできますか?コードに複数のTraceSourceが必要になるユースケースについて知りたいだけです。
1 に答える
TraceSource の使用に関する適切な出発点として、他の質問に対する次の回答を参照してください。
.net 2010 のトレースと app.config を理解できない
複数のクラスがある場合はいつでも、複数の 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 のユーザーが機能領域ごとに TraceSource を取得することがよくあると思います。
そのため、アプリを「読み取り」、「処理」、および「書き込み」機能 (またはあなたにとって意味のあるもの) に分割することができます。その場合、クラスが使用される機能領域に基づいて、クラスで適切な TraceSource を取得できます。
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 つは、TraceSource 名を出力することです。そのため、出力では、ログの意味を理解しやすくなります。そうすることを選択した場合、特定の機能領域から (または特定の TraceSource によって) 生成されたすべてのログ メッセージを比較的簡単に見つけることができるからです。
適切な名前空間の命名規則がある場合は、名前空間階層内のノードに基づいて、またはクラスが存在するアセンブリに基づいて、各クラスの TraceSource を取得することを検討することもできます。取得する Type の .NET 呼び出しがあります。あなたのためのその情報。
TraceSources を見ているので、このプロジェクトを codeplex で見ることをお勧めします。
http://ukadcdiagnostics.codeplex.com/
これは、log4net や NLog でできることと同様の方法でログ出力をフォーマットできる (TraceSource に基づく) 優れたプロジェクトです。
また、Castle の TraceSource を中心に構築されたこのロギング ラッパーもご覧になることをお勧めします。
https://github.com/castleproject/Castle.Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs
彼らが行った興味深いことは、TraceSource 名に階層を提供することです。私は過去に似たようなものを実装しました。それはかなりうまくいきます。
この質問に対する私の回答は、TraceSource 階層がどのように役立つかについてのアイデアを提供します。
幸運を!