防止log4net通过SMTP发送重复的问题

时间:2010-03-09 13:58:03

标签: asp.net log4net jira

我们使用SMTP将我们的log4net与Jira连接起来。

现在我们担心,由于网站是公开的,如果我们在生产环境中遇到很多问题,Jira服务器会发生什么。

我们已经对Critical和Fatal进行了过滤,但是我们希望在log4net上看到一些累加器服务,或者是一个简单的过滤器,它可以识别重复的问题并阻止它们通过电子邮件发送。最好不必更改错误报告代码,因此配置解决方案最好。

我想将日志转储到数据库中,然后创建一个单独的侦听器,某些智能代码将成为(pricy)替代方案。

2 个答案:

答案 0 :(得分:17)

也许this足以满足您的要求:

它基本上限制了在给定时间跨度内发送的电子邮件数量。我认为根据您的需求定制它应该很容易。我做了类似的事情甚至在一定时间内丢弃了消息:

public class SmtpThrottlingAppender : SmtpAppender
{
    private DateTime lastFlush = DateTime.MinValue;
    private TimeSpan flushInterval = new TimeSpan(0, 5, 0);

    public TimeSpan FlushInterval
    {
        get { return this.flushInterval; }
        set { this.flushInterval = value; }
    }

    protected override void SendBuffer(LoggingEvent[] events)
    {
        if (DateTime.Now - this.lastFlush > this.flushInterval)
        {
            base.SendBuffer(events);
            this.lastFlush = DateTime.Now;
        } 
    }
}

刷新间隔可以配置为其他appender的正常设置:

<flushInterval value="01:00:00" />

答案 1 :(得分:4)

你也可以使用普通的SmtpAppender和log4net.Core.TimeEvaluator作为评估者。

假设我们的间隔为5分钟,事件发生在00:00,00:01和01:00。

  • Stefan Egli的SmtpThrottlingAppender将在00:00(活动1)和01:00(活动2和3)发送电子邮件。
  • 带有TimeEvaluator的SmtpAppender将在00:05(事件1和2)和01:05(事件3)发送电子邮件。

您想要哪一个取决于您是否更多地受到保证延迟或潜在大延迟的困扰。

我尝试将SmptThrottlingAppender与TimeEvaluator结合使用,但无法获得我想要的行为。我开始怀疑我应该编写一个新的ITriggeringEventEvaluator,而不是一个新的IAppender。