6

WCF サービス (NLog や PostSharp などのテクノロジを含む) のログ記録を検討してきましたが、まだ解決していないことがあります... 明らかな何かが欠けているのか、単に不可能なのかわかりません。

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

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

4

2 に答える 2

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...

        }
    }
}

次に、それでフィルタリングするカスタムアペンダーを作成します。

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の動作を適用する方法を選択する場合、アペンダーはこの複雑さを必要としません。)

この動作を実行することにより、サービスコードに触れることなく、構成のみで本番サービスのロギングを制御するためのいくつかのオプションがあります。

于 2012-10-15T15:50:45.750 に答える
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>
于 2012-10-15T08:56:41.870 に答える