0
重複メッセージを排除するためにlog4netを設定するオプションはありますか?私はサイクルで動作するアプリケーションを持っています...無限のサイクルがあります。エラーが発生した場合(たとえば、データベースにアクセスできない場合)、すべてのループで同じメッセージが繰り返し記録されます。メッセージを一度だけログに記録する必要があります。Log4net、重複メッセージを排除
重複メッセージを排除するためにlog4netを設定するオプションはありますか?私はサイクルで動作するアプリケーションを持っています...無限のサイクルがあります。エラーが発生した場合(たとえば、データベースにアクセスできない場合)、すべてのループで同じメッセージが繰り返し記録されます。メッセージを一度だけログに記録する必要があります。Log4net、重複メッセージを排除
私は指定された時間間隔の間に同じメッセージを排除するためにlog4netフィルタを実装しました。
クラス:
public class DuplicityFilter : FilterSkeleton
{
private String lastMessage = null;
private List<Tuple<DateTime, String>> lastMessages = new List<Tuple<DateTime,string>>();
private Int32 _timeWindow = 0;
public Int32 timeWindow
{
get { return _timeWindow; }
set { _timeWindow = value; }
}
public Boolean _lastOnly = false;
public Boolean lastOnly
{
get { return _lastOnly; }
set { _lastOnly = value; }
}
public override FilterDecision Decide(log4net.Core.LoggingEvent loggingEvent)
{
if (_lastOnly)
{
if (lastMessage == loggingEvent.RenderedMessage)
{
return FilterDecision.Deny;
}
else
{
lastMessage = loggingEvent.RenderedMessage;
return FilterDecision.Accept;
}
}
else
{
if (_timeWindow <= 0)
return FilterDecision.Accept;
// Removes old messages
lastMessages.RemoveAll(m => m.Item1 < DateTime.Now.AddSeconds(0 - _timeWindow));
if (!lastMessages.Any(m => m.Item2 == loggingEvent.RenderedMessage))
{
lastMessages.Add(new Tuple<DateTime, string>(loggingEvent.TimeStamp, loggingEvent.RenderedMessage));
return FilterDecision.Accept;
}
else
{
return FilterDecision.Deny;
}
}
}
そしてXML定義:
<filter type="your.namespace.here.DuplicityFilter">
<timeWindow value="900" /> <!-- 15min -->
<lastOnly value="false" />
</filter>