【问题标题】:Logback SMTPAppender Limiting RateLogback SMTPAppender 限制速率
【发布时间】:2010-12-31 20:55:02
【问题描述】:

如何限制发送 Logback SMTPAppender 的电子邮件速率,使其最多每 n 分钟向我发送一次电子邮件?

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

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

【问题讨论】:

  • 速率限制是那些令人沮丧的棘手问题之一。如果 logback 有一个简单的解决方案,我会感到惊讶。
  • @skaffman,你能解释一下复杂性吗?我知道这可能会隐藏一些故障,以防在不太严重的错误之后稍微发生严重错误。

标签: java logging logback smtpappender


【解决方案1】:

根据文档,执行此操作的方法似乎是编写一个 EventEvaluator(参见示例 4.14 和 4.15),它查看每个事件的时间戳,以便仅在自最后一个事件被接受了。

您可以使用 System.currentTimeMillis 来获取一个数字,您可以对其进行数学运算来计算时差。 http://java.sun.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis%28%29

【讨论】:

    【解决方案2】:

    作为 Thorbjørn,很容易创建一个 EventEvaluator 来限制 appender 触发消息的速率。

    但是,我发现 Logback 支持 DuplicateMessageFilter,这可能以一种苦涩的方式解决了我的问题:“DuplicateMessageFilter 值得单独展示。这个过滤器检测重复的消息,超过一定数量的重复,丢弃重复的消息。 "

    【讨论】:

      【解决方案3】:

      这个工具可以做你想做的事,但它根本不是线程安全的:http://code.google.com/p/throttled-smtp-appender/wiki/Usage

      我写了一个线程安全的版本,但还没有开源。

      您很难找到合适的工具的原因是 SMTP 不是真正的端点。使用 loggly、airbrake 或其他数十种服务,或使用 logstash 等服务运行您自己的服务器。

      【讨论】:

        【解决方案4】:

        看看新的 Whisper 附加程序。它会进行智能抑制。可通过 Maven 和 github 获取 here

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

        【讨论】:

          【解决方案5】:

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

          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>
          

          【讨论】:

            【解决方案6】:

            我建议提交一个请求此功能的 jira 项目。只要提出要求,它就有可能实现。

            【讨论】:

              【解决方案7】:

              顺便说一句,

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

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

              玩得开心。

              【讨论】:

                猜你喜欢
                • 2014-09-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-10-13
                • 2020-11-04
                • 2021-01-22
                • 1970-01-01
                相关资源
                最近更新 更多