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.
}
}
これは非常に単純な(しかし明確な)アイデアの例です。あなたが説明するように、私は本当にのように大規模にサービスを、これを構築している場合
、私はなります:すべてのコールの
は、メソッド名をつかみ、log4netのコンテキスト値を設定IOperationInvokerエンドポイントの振る舞いを作成します。そのに適用されます。
(オプション)アペンダーに、app.configからログに記録するすべてのサービスメソッド名のフィルターリストを読み込ませます。あなただけでは構成によって生産サービスのロギングを制御するためのいくつかのオプションを持っている(あなたがOperationInvokerの動作が適用されているどのような方法で選択されている場合は、アペンダはこの複雑さを必要としません。)
動作を行うことにより、サービスコードに触れることなく
ありがとう!それはちょうど私が探しているもののタイプです。理想的には、log4net以上のログを使用したいと思っていますが、これはもう少しアクティブに思えますが、これはまさに私の心を変えるようなものです...怒りのようなコードを使用しましたか?どのようにマルチスレッドサービスを扱うだろうか? –
log4net.ThreadContextは、スレッドローカルストレージを使用します。サービスコールがスレッドをホップしない限り(マルチスレッド環境ではうまく動作します)はい、私は実際のプロダクションエンタープライズサービスのためにこれらのいくつかを行っています。最後に、すべてのログエンティティに相関IDを入れることでした(ThreadContextにプッシュされたものはすべて、アペンダの変換パターンに含めることができます)。log4netは、欠落がほとんどなく、拡張が非常にうまく文書化されているため、あまりアクティブではありません。ジェネリック医薬品の前に書かれていたことを胃にすることができれば、それはあなたをよく扱います。 – ErnieL
ありがとうアーニー。それはまさに私が探していたタイプのものでした! –