これはおそらく手遅れですが、フィルタを実装できます。 http://www.mail-archive.com/log4net-user%40logging.apache.org/msg02517.htmlは、例外が記録される頻度を制限するフィルタを実装する方法を示しています(例外の種類が最後の例外の種類と同じで、指定された時間が経過していない場合)。ここで
は、そのリンクから実際のフィルタのソースコードです:
public class ExceptionThrottleFilter : FilterSkeleton
{
private DateTime lastException = DateTime.MinValue;
private Type exceptionType = typeof(Exception);
private int threshold = 5; // seconds
public override void ActivateOptions()
{
base.ActivateOptions();
}
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
if (loggingEvent.ExceptionObject != null && loggingEvent.ExceptionObject.GetType) == exceptionType)
{
if (loggingEvent.TimeStamp.Subtract(lastException).TotalSeconds > threshold)
{
lastException = loggingEvent.TimeStamp;
return FilterDecision.Accept;
}
else
{
return FilterDecision.Deny;
}
}
else
{
return FilterDecision.Neutral;
}
}
public Type ExceptionType
{
get { return exceptionType; }
set { exceptionType = value; }
}
public int Threshold
{
get { return threshold; }
set { threshold = value; }
}
}
それはこのように構成されます:スロットル」にそれを修正する非常に簡単になるように
<filter type="Company.Project.Logging.ExceptionThrottleFilter">
<threshold value="2" />
<exceptionType value="System.ApplicationException" />
</filter>
に思えます"繰り返すメッセージ。このようなたぶん何か(未テスト):
public class DuplicateMessageThrottleFilter : FilterSkeleton
{
private string lastMessage;
public override void ActivateOptions()
{
base.ActivateOptions();
}
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
string newMessage;
if (loggingEvent.MessageObject != null)
{
newMessage = loggingEvent.MessageObject.ToString();
}
if (newMessage.Equals(lastMessage))
{
return FilterDecision.Deny;
}
lastMessage = newMessage;
return FilterDecision.Accept;
}
}
どのようにそれを行うには、それが繰り返された回数と記録されたメッセージに注釈を付けるのはいいことかもしれませんが、私には明らかにされていません。
Some message.
Some message.
Some message.
Look, a new message.
Some message.
Some message.
Look, a new message.
Some message. (3 times)
Look, a new message.
Some message. (2 times)
Look, a new message.
ForwardingAppenderまたはBufferingForwardingAppenderのおそらくいくつかの種類:このような何かを生成することができます。それは常に1つのメッセージの背後にあるでしょう。メッセージが入ります。「RepeatedMessageAppender」はそのメッセージを保持します。最後のメッセージと異なる場合は、最後のメッセージを「本当の」アペンダーに転送します(「繰り返しカウント」が0より大きい場合は、転送前に最後のメッセージに番号を追加します - これは私の一部です)。 Appenderに渡されるLoggingEventを変更するのは簡単ではないと思うからです)。最後のメッセージと同じ場合は、カウンタをインクリメントして転送しないでください。 "RepeatedMessageAppender"は1つ遅れているため、おそらくBufferingForwardingAppenderでなければならず、Flushを実装する必要があります。
多分、あなた(または他の誰か)がこの情報を役立つでしょう。
確かに非常に便利です。 「何回」タグ付けするには、回数を格納するプロパティを使用し、value = "%message(%property {numberOfSimilar} times)"のようにPatternLayoutで表示することをお勧めします。このプロパティはGlobalContext.Properties [Decision(LoggingEvent)]で設定できます["numberOfSimilar"] ++; – PPC
これは決して遅すぎることはありません... – KornMuffin