2010-01-02 70 views
14

如何限制电子邮件的速率Logback SMTPAppender,以便每发送一次n分钟最多给我发一封电子邮件?Logback SMTPAppender限制率

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

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

+1

速率限制是解决这些令人沮丧的棘手问题之一。如果logback有一个简单的解决方案,我会感到惊讶。 – skaffman 2010-01-02 22:12:32

+0

@skaffman,你能解释一下复杂性吗?我知道这可能会隐藏一些故障,以防出现严重错误后发生轻微错误。 – notnoop 2010-01-02 22:18:24

回答

0

我建议申请一个jira项目来请求这个功能。如果只有被问到,它很可能会被实施。

6

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

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

0

顺便说一句,

的logback v0.9.26允许立即设置SMTPAppender消息缓冲区的大小。直到昨天,它会发送缓冲区的最新消息,最多256条消息,因为我只想显示电子邮件中的最后一条,这对我来说是个痛苦的脖子。因此,现在可以按照我对这个问题的解释,定期执行定期发送的电子邮件警告,这些警告只带有一个特定的错误。

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

玩得开心。

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> 
2

该工具会做你想要什么,但它不是在所有的线程安全:http://code.google.com/p/throttled-smtp-appender/wiki/Usage

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

您找不到合适工具的原因是SMTP不是真正的终端。使用类似loggly,airbrake或其他许多服务的服务,或者使用类似logstash的方式运行自己的服务器。

2

看看这个新的Whisper appender。它确实能够抑制智能。通过Maven和github提供here

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