2012-10-15 12 views
6

WCFサービス(NLogやPostSharpなどのテクノロジーを含む)のログ記録を見てきましたが、まだ解決していないことがあります。何か明白か、それはただ不可能です。WCFサービス、垂直方向のログ

私は100以上のWebサービスコールエントリポイントを持つWCFサービス層を持っているとします。これらのうちの1つが問題を引き起こしています。その層の下には、ビジネス・ロジック層とデータベース層があります。私がやりたいことは、そのサービスコール(相関のアクティビティーIDを含む)のログをオンにして、そのサービスへの呼び出しをログに記録し、下位層のログメッセージも記録するようにします。下位層のアセンブリレベルでログを記録するのは、Webサービスの多くの方法で共有されるため、実際には有効にしたくありません。

これは、既存のフレームワークや、創造的な方法でCorrelationManagerのようなものを使用することによっても可能ですか?

答えて

1

log4netでは、スレッドのすべてのロギングイベントに含まれるスレッドコンテキストにプロパティを設定できます。

public class WcfServiceClass 
{ 
    public void ProblemServiceMethod() 
    { 
     using (log4net.ThreadContext.Stacks["logThisMethod"].Push("ProblemServiceMethod")) 
     { 
      // can also add the correlationId to the logs using this method. 
      // call business logic... 

     } 
    } 
} 

次に、それによってフィルタリングするcreate a custom appender

public class IfContextSetFilterAppender : log4net.Appender.AppenderSkeleton 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     bool logThisEntry = false; 
     string serviceMethodBeingLogged; 

     foreach (object p in loggingEvent.GetProperties()) 
     { 
      System.Collections.DictionaryEntry dEntry = (System.Collections.DictionaryEntry)p; 
      if (dEntry.Key == "logThisMethod") 
      { 
       logThisEntry = true; 
       serviceMethodBeingLogged = dEntry.Value.ToString(); 
      } 
     } 

     if (!logThisEntry) 
      return; // don't log it. 

     // log it. 
    } 
} 

これは非常に単純な(しかし明確な)アイデアの例です。あなたが説明するように、私は本当にのように大規模にサービスを、これを構築している場合

、私はなります:すべてのコールの

  1. は、メソッド名をつかみ、log4netのコンテキスト値を設定IOperationInvokerエンドポイントの振る舞いを作成します。そのに適用されます。

  2. (オプション)アペンダーに、app.configからログに記録するすべてのサービスメソッド名のフィルターリストを読み込ませます。あなただけでは構成によって生産サービスのロギングを制御するためのいくつかのオプションを持っている(あなたがOperationInvokerの動作が適用されているどのような方法で選択されている場合は、アペンダはこの複雑さを必要としません。)

動作を行うことにより、サービスコードに触れることなく

+0

ありがとう!それはちょうど私が探しているもののタイプです。理想的には、log4net以上のログを使用したいと思っていますが、これはもう少しアクティブに思えますが、これはまさに私の心を変えるようなものです...怒りのようなコードを使用しましたか?どのようにマルチスレッドサービスを扱うだろうか? –

+0

log4net.ThreadContextは、スレッドローカルストレージを使用します。サービスコールがスレッドをホップしない限り(マルチスレッド環境ではうまく動作します)はい、私は実際のプロダクションエンタープライズサービスのためにこれらのいくつかを行っています。最後に、すべてのログエンティティに相関IDを入れることでした(ThreadContextにプッシュされたものはすべて、アペンダの変換パターンに含めることができます)。log4netは、欠落がほとんどなく、拡張が非常にうまく文書化されているため、あまりアクティブではありません。ジェネリック医薬品の前に書かれていたことを胃にすることができれば、それはあなたをよく扱います。 – ErnieL

+0

ありがとうアーニー。それはまさに私が探していたタイプのものでした! –

0

特定のサービスコールの新しいロギングソースを作成し、それをフィルタするために診断を有効にすることができます。

<system.diagnostics> 
    <sources> 
     <source name="Your.Source.Here" switchValue="Verbose"> 
     <listeners> 
      <add name="xml" /> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="LogicalOperationStack" initializeData="l:\logs\N4S.MSO.ADC.Host.svclog" /> 
    </sharedListeners> 
    </system.diagnostics> 
+0

これは、下位層のログフレームワークへの呼び出しでもソース名を知る必要があるとは限りませんか? –

+0

Chris - btw、入力いただきありがとうございます。非常に感謝! –

関連する問題