日志级别的 Logstash 指标过滤器

Logstash metric filter for log-level

有人可以帮助我使用指标过滤器吗?我想设置 logstash 以每 5 秒检查一次 log-level=Error,如果 log-level=ERROR 超过 1,应该发送一封电子邮件。我正在使用 logstash 2.2.4

input {
      file {
        path => "/var/log/logstash/example"
        start_position => beginning
      }
    }

filter {
 grok{
   match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{LOGLEVEL:log-level}\s*\]" }
 }
 if [log-level] == "ERROR" {
   metrics {
       meter => [ "log-level" ]
       flush_interval => 5
       clear_interval => 5
      }
   }
}
output {
if [log-level] == "ERROR" {
  if [log-level][count] < 1 {
    email {
        port => 25
        address => "mail.abc.com"
        authentication => "login"
        use_tls => true
        from => "alerts@logstash.com"
        subject => "logstash alert"
        to => "siya@abc.com"
        via => "smtp"
        body => "here is the event line %{message}"
        debug => true
      }
    }
  }
}

社论:

我不喜欢 metrics {} 过滤器,因为它打破了假设。 Logstash 是多线程的,指标是仅在其线程内保持状态的过滤器之一。如果你使用它,你需要知道如果你是 运行 4 个管道工作者,你有 4 个 independent 线程保持它们自己的状态。这打破了所有即将到来的事件 "into logstash" 都将被计算为 "by the metrics filter".

的假设

对于您的用例,我建议不要使用 Logstash 来发送此电子邮件,而是依赖于访问您的后备存储的外部轮询机制。


因为这是指标过滤器,我强烈建议您将过滤器工作人员的数量设置为 1。这是 logstash 启动时的 -w 命令行选项。您将失去并行性,但您将获得单个过滤器查看 所有 事件的能力。如果你不这样做,你可能会遇到这样的情况,比如说,6 个线程每个都看到一个 ERROR 事件;你会收到六封电子邮件。

您的配置可以使用一些更新。建议在 metrics {} 过滤器中添加标签或其他内容。

 metrics {
     meter => [ "log-level" ]
     flush_interval => 5
     clear_interval => 5
     add_tag => "error_metric"
    }
 }

这样,您可以更好地过滤电子邮件段。

output {
  if [tags] include "error_metric" and [log-level][count] > 1 {
    email {
    }
  }
}

这是因为 metrics {} 过滤器在刷新时会创建一个新事件,而不是修改现有事件。您需要使用过滤器捕捉新事件。