Logback SMTPAppender限制率

时间:2010-01-02 22:08:08

标签: java logging logback smtpappender

如何限制退回电子邮件的费率SMTPAppender,以便每隔 n 分钟给我发送一次电子邮件?

我已根据Logback appender设置了我的日志记录,但我不太明白它是如何配置或子类化来实现的。

是否有隐藏的功能?有人开发了一个子类来处理这个吗?

7 个答案:

答案 0 :(得分:6)

根据文档看来,执行此操作的方法是编写一个EventEvaluator(参见示例4.14和4.15),该事件查看每个事件的时间戳,仅接受自“足够的时间”以来已经过去的事件。最后一个事件被接受了。

您可以使用System.currentTimeMillis获取可以数学计算的数字来计算时差。 http://java.sun.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis%28%29

答案 1 :(得分:6)

正如Thorbjørn所说,创建EventEvaluator很容易限制appender触发消息的速度。

然而,我发现Logback支持DuplicateMessageFilter,这可能会以一种痛苦的方式解决我的问题:“DuplicateMessageFilter需要单独的演示。此过滤器检测到重复的消息,超过一定的重复次数,重复丢弃消息“。

答案 2 :(得分:2)

这个工具可以完全按照您的要求运行,但它根本不是线程安全的:http://code.google.com/p/throttled-smtp-appender/wiki/Usage

我编写了一个线程安全版但尚未开源。

您无法找到好的工具的原因是SMTP不是真正的端点。使用像loggly,airbrake或许多其他服务,或使用logstash之类的东西运行自己的服务器。

答案 3 :(得分:2)

看看新的Whisper appender。它做智能抑制。可通过Maven和github here

获得

法定免责声明:我是作者。

答案 4 :(得分:1)

为了解决同样的问题,我编写了自定义评估程序。它扩展了ch.qos.logback.classic.boolex.OnMarkerEvaluator,但您可以使用任何其他评估程序作为基础。如果在静默区间有许多可接受的消息,评估者将丢弃这些消息。对于我的用例,没关系,但是如果你需要不同的行为 - 只需要为第二个添加额外的检查。

public class LimitingOnMarkerEvaluator extends OnMarkerEvaluator {

  private long lastSend = 0, interval = 0;

  @Override
  public boolean evaluate(ILoggingEvent event) throws EvaluationException {
    if (super.evaluate(event)) {
      long now = System.currentTimeMillis();

      if (now - lastSend > interval) {
        lastSend = now;
        return true;
      }
    }

    return false;
  }


  public long getInterval() {
    return interval;
  }

  public void setInterval(long interval) {
    this.interval = interval;
  }

}

配置每1000秒(约17分钟)发送最多一条消息:

<evaluator class="package.LimitingOnMarkerEvaluator">
  <marker>FATAL</marker>
  <interval>1000000</interval>
</evaluator>

答案 5 :(得分:0)

我建议提交一个请求此功能的jira项目。如果只是被问到,可能会实施。

答案 6 :(得分:0)

顺便说一下,

Logback v0.9.26现在允许设置SMTPAppender消息缓冲区的大小。直到昨天它才会发送缓冲区的当前记录,这些记录最多有256条消息,因为我只想显示电子邮件中的最后一条消息。因此,根据我对此问题的解释,现在可以实现定期重复发送的电子邮件警告,这些警告只带有一个特定错误。

http://logback.qos.ch/manual/appenders.html#cyclicBufferSize

玩得开心。