Log4net, eliminate duplicate messages

风格不统一 提交于 2019-12-02 13:59:39

问题


is there any option to setup log4net to eliminate duplicate messages? I have an application which works in cycles...there is an infinate while cycle. If any error occure (for example database is not accesible), same message is logged again and again in every loop. I need to log the message just once.


回答1:


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>


来源:https://stackoverflow.com/questions/41674751/log4net-eliminate-duplicate-messages

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!