5

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

4

1 に答える 1

9

TraceSource の使用に関する適切な出発点として、他の質問に対する次の回答を参照してください。

.net 2010 のトレースと app.config を理解できない

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

複数のクラスがある場合はいつでも、複数の 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 階層がどのように役立つかについてのアイデアを提供します。

ロギングへの最良のアプローチは何ですか?

幸運を!

于 2011-02-01T21:34:43.437 に答える