我怎样才能限制发送电子邮件的速率 Logback SMTPAppender
,以便它最多每n分钟向我发送一次电子邮件?
我已经根据Logback appender设置了我的日志记录,但我不太明白它是如何配置或子类化来实现的。
有隐藏功能吗?有人开发了一个子类来处理这个吗?
我怎样才能限制发送电子邮件的速率 Logback SMTPAppender
,以便它最多每n分钟向我发送一次电子邮件?
我已经根据Logback appender设置了我的日志记录,但我不太明白它是如何配置或子类化来实现的。
有隐藏功能吗?有人开发了一个子类来处理这个吗?
根据文档,执行此操作的方法似乎是编写一个 EventEvaluator(参见示例 4.14 和 4.15),它查看每个事件的时间戳,以便仅在自上次事件发生后“足够时间”过去时才接受事件公认。
您可以使用 System.currentTimeMillis 来获取一个可以进行数学运算以计算时差的数字。 http://java.sun.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis%28%29
作为 Thorbjørn,很容易创建一个EventEvaluator
限制 appender 触发消息的速率。
但是,我发现 Logback 支持DuplicateMessageFilter
,这可能以一种痛苦的方式解决了我的问题:“DuplicateMessageFilter 值得单独展示。这个过滤器检测到重复的消息,并且超过一定数量的重复,丢弃重复的消息。”
这个工具会做你想要的,但它根本不是线程安全的: http ://code.google.com/p/throttled-smtp-appender/wiki/Usage
我写了一个线程安全的版本,但还没有开源。
您很难为此找到好的工具的原因是 SMTP 不是真正的端点。使用 loggly、airbrake 或其他许多服务,或者使用 logstash 之类的东西运行您自己的服务器。
看看新的 Whisper appender。它会进行智能抑制。可在此处通过 Maven 和 github 获得
法定免责声明:我是作者。
为了解决同样的问题,我编写了自定义评估器。它扩展了 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>
我建议提交一个请求此功能的 jira 项目。如果只要求,它很可能会实施。
顺便提一句,
Logback v0.9.26 现在允许设置 SMTPAppender 消息缓冲区的大小。直到昨天它会发送缓冲区的当前内容,最多有 256 条消息,恕我直言,我只想显示电子邮件中的最后一条消息,这让我很头疼。因此,根据我对这个问题的解释,现在可以实施仅携带一个特定错误的定期重复的电子邮件警告。
http://logback.qos.ch/manual/appenders.html#cyclicBufferSize
玩得开心。