Ограничение скорости SMTPAppender

Как я могу ограничить скорость отправки сообщений электронной почты в виде журнала SMTPAppender, чтобы он отправил мне письмо не чаще одного раза в несколько минут?

Я установил свой журнал в соответствии с Logback appender, но я не совсем понимаю, как его настроить или подклассифицировать для его реализации.

Есть ли скрытая функция? Кто-то разработал подкласс, чтобы справиться с этим?

Ответы

Ответ 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 здесь

Уставная оговорка: я автор.

Ответ 5

Чтобы решить ту же проблему, я написал собственный оценщик. Он расширяет 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>

Ответ 6

Я предлагаю подать элемент jira, запрашивающий эту функцию. Вероятно, он будет реализован, если его спросят.

Ответ 7

Btv,

Logback v0.9.26 теперь позволяет установить размер буфера сообщений SMTPAppender. До вчерашнего дня он отправил текущие копии буфера, в котором было до 256 сообщений, которые имхо было болью в шее, поскольку я хотел показать только последний в письме. Таким образом, теперь можно внедрять периодически повторяющиеся предупреждения по электронной почте, которые несут только одну конкретную ошибку в соответствии с моей интерпретацией этого вопроса.

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

Удачи.