Log4net, eliminate duplicate messages

耗尽温柔 提交于 2019-12-02 03:42:53

I have implemented log4net filter to eliminate same messages during specified time interval.

The class:

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;
            }
        }
    }

And the XML definition:

  <filter type="your.namespace.here.DuplicityFilter">
    <timeWindow value="900" /> <!-- 15min -->
    <lastOnly value="false" />
  </filter>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!