代码之家  ›  专栏  ›  技术社区  ›  notnoop

回写smtpappender限制速率

  •  15
  • notnoop  · 技术社区  · 15 年前

    我怎样才能限制邮件的回复率 SMTPAppender ,以便它最多每 n 几分钟?

    我已经根据 Logback appender ,但我不太明白如何配置或子类来实现它。

    有隐藏的特征吗?有人开发了一个子类来处理这个问题吗?

    7 回复  |  直到 11 年前
        1
  •  6
  •   Thorbjørn Ravn Andersen    15 年前

    根据文档,这样做的方法似乎是编写一个eventevaluator(参见示例4.14和4.15),它查看每个事件的时间戳,以便在自上一个事件被接受以来“足够的时间”已过时仅接受一个事件。

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

        2
  •  6
  •   notnoop    15 年前

    作为Thorbj_rn,创建一个 EventEvaluator 这限制了附加程序触发消息的速率。

    但是,我发现洛格巴克支持 DuplicateMessageFilter ,这很可能以一种痛苦的方式解决了我的问题:“DuplicateMessageFilter值得单独演示。此筛选器检测重复的邮件,超过一定的重复次数后,将丢弃重复的邮件。“

        3
  •  2
  •   djechlin    11 年前

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

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

    找不到合适的工具的原因是smtp不是一个真正的端点。使用loggly、airbrake等服务,或者使用logstash之类的工具运行自己的服务器。

        4
  •  2
  •   Καrτhικ    11 年前

    看看新的耳语附加器。它能进行智能抑制。通过Maven和Github提供 here

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

        5
  •  1
  •   valodzka    11 年前

    为了解决同样的问题,我编写了自定义计算器。它扩展了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
  •  0
  •   Ceki    15 年前

    我建议提交一个jira项目请求这个功能。只要有人要求,它就可能得到实施。

        7
  •  0
  •   danirod    14 年前

    顺便说一句,

    logback v0.9.26现在允许设置smtpappender消息缓冲区的大小。直到昨天,它还将发送缓冲区的当前内容,其中多达256条消息,这让imho很头疼,因为我只想在电子邮件中显示最后一条。因此,根据我对这个问题的解释,现在可以实现周期性重复的电子邮件警告,其中只包含一个特定的错误。

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

    玩得高兴。

    推荐文章