2013-03-21 13 views
5

私は自分のLoggingがそれぞれClassに対して異なるTraceSourceを使用するように設定しました。System.Diagnosticsソース名のワイルドカードをトレースします

すべてのソースに対してイベントを書き込むワイルドカードを設定できますか?

<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

私はそれを自動的に行う方法を知らない。しかし、CastleのgitリポジトリにあるTraceLoggerを見ると、「hierarichal」という名前をサポートするためにTraceSourceが本質的にラップされ拡張されていることがわかります。

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

私はここのコードをコピーしますが、それだけでSOにあり、コードをカット&ペーストして適切ではないかもしれません。

私はクラスで提示アイデアが(それがものをログに記録したい)クライアントコードでは、本質的には

(お城を使用せずに)あなたのために働く可能性がどのように説明することができ、あなたがインスタンスを作成しますあなたの "ロガー"(TraceSourceではなく)の。ロガーへの入力として、たとえば、完全修飾クラス名を指定します。コンストラクタ内では、入力名を使用してTraceSourceを解決します。その名前で構成されたTraceSourceがある場合は、そのTraceSourceを使用して作業します。そうでない場合は、完全修飾名の右端を切り取ります。その名前のTraceSourceを解決しようとします。その名前で構成されたTraceSourceがある場合は、それを使用します。等々。 TraceSourcesが見つからない場合は、「ロガー」から何もログに記録しないでください。ワイルドカード名( "")で構成されたTraceSourceを認識する機能を追加することができます。名前トリミングテクニックを使用して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にロガーを指定することができます。

幸運を祈る!

+0

この回答は素晴らしいです。私はすでにあなたが提案したのとほぼ同じことをしました。私はロガーに完全なクラス名を与え、アセンブリを解決しようとしました。次に、アセンブリ名をログソースとして使用しました。 (私はすべての私のアセンブリが設定されているため、さまざまな情報源を持っていました)。しかし私は自分のワイルドカードソースを作ることについて決して考えなかった。また、私は解決のあなたの方法はよりflexabillityを持っていると確かに高速です。ありがとう、私はこれを実装するのは難しい、非常に便利です! –

関連する問題