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.
}
}
これは、非常に単純な(しかし明確な)アイデアの例です。
あなたが説明するのと同じくらい大規模なサービスにこれを実際に構築しているとしたら、私は次のようになります。
メソッド名を取得し、適用されるすべての呼び出しにlog4netコンテキスト値を設定するIOperationInvokerエンドポイント動作を作成します。
(オプション)アペンダーにapp.configから、ログに記録する必要のあるすべてのサービスメソッド名のフィルターリストを読み取らせます。(OperationInvokerの動作を適用する方法を選択する場合、アペンダーはこの複雑さを必要としません。)
この動作を実行することにより、サービスコードに触れることなく、構成のみで本番サービスのロギングを制御するためのいくつかのオプションがあります。