6

それぞれに異なるものを使用するようにLogging設定しています。TraceSourceClass

すべてのソースのイベントを書き込むワイルドカードを構成することは可能ですか?

<system.diagnostics>
  <sources>
    <source name ="wildcard" switchValue="Warning">
      <listeners>
        <add name="textlog" />
      </listeners>
    </source>
    <source name="MySpecificClass" switchValue="All">
      <listeners>
        <add name="textlog" />
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="textlog"
         type="System.Diagnostics.TextWriterTraceListener"
         initializeData="Log.log">
    </add>
  </sharedListeners> 
  <trace autoflush="true"/>
</system.diagnostics>
4

1 に答える 1

4

それを自動的に行う組み込みの方法を知りません。ただし、Castle の git リポジトリにある TraceLogger を見ると、TraceSource が基本的にラップおよび拡張され、「階層的な」命名をサポートしていることがわかります。

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

ここにコードをコピーしますが、コードを切り取って SO に貼り付けるのは適切ではないかもしれません。

クラスで提示されたアイデアがどのように役立つかを説明できます (Castle を使用する必要はありません)。

要するに、(ログを記録したい) クライアント コードで、(TraceSource ではなく) 「ロガー」のインスタンスを作成します。ロガーへの入力として、たとえば、完全修飾クラス名を指定します。コンストラクター内で、入力名を使用して TraceSource の解決を試みます。その名前で構成された TraceSource がある場合は、その TraceSource を使用して作業を行います。そうでない場合は、完全修飾名の右端を切り取ります。その名前で TraceSource を解決してみてください。その名前で構成された TraceSource がある場合は、それを使用します。等々。TraceSources が見つからない場合は、「ロガー」から何も記録しないでください。ワイルドカード名 (""). 名前トリミング手法を使用しても TraceSource が見つからず、" " TraceSource が存在する場合は、"*" TraceSource をフォールバックとして使用してください。

したがって、次のようなものがあるかもしれません:

class MyTraceSource
{
  private TraceSource ts;

  public MyTraceSource(string name)
  {
    ResolveTraceSource(name);
  }

  private void ResolveTraceSource(string name)
  {
    //Check for a configured TraceSource from most qualified name (as input) to least qualified ("").
    //Assume name like this:  Namespace1:Namespace2:Class
    //Try to resolve:
    // TraceSource("Namespace1.Namespace2.Class");
    // TraceSource("Namespace1.Namespace2");
    // TraceSource("Namespace1");
    //If you still haven't found one, try to resolve
    // TraceSource("*");
  }

  //Implement either TraceSource API, or whatever API you prefer for logging.

}

私は実際にプロトタイプの一部としてこのようなことを自分で行いました (最終的には使用しませんでした)。これは、log4net と NLog でロガーを指定できる方法を模倣するのに非常にうまく機能しました。

幸運を!

于 2013-03-29T19:50:00.577 に答える