Logstash 如何停止将事件发送到输出

Logstash 如何停止将事件发送到输出,logstash,Logstash,我是logstash的新手,我正试图找到一种记录nginx事件的方法。我不想记录所有访问事件,只想记录404事件,所以我尝试了以下方法: 我当前的配置如下所示 input { beats { port => 5044 host => "localhost" } } filter { if [fields][type] == "nginx" { if [fields][category] == "access" { grok {

我是logstash的新手,我正试图找到一种记录nginx事件的方法。我不想记录所有访问事件,只想记录404事件,所以我尝试了以下方法:

我当前的配置如下所示

input {
  beats {
    port => 5044
    host => "localhost"
  }
}
filter {
  if [fields][type] == "nginx" {
    if [fields][category] == "access" {
      grok {
        match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
        remove_field => "message"
      }

      if "404" != [nginx][access][response_code] {
        drop {}
      } 
    }
  }
}

output {
  lumberjack {
    hosts => ["listener.logz.io"]
    port => 5006
    ssl_certificate => "/usr/share/logstash/keys/TrustExternalCARoot.crt"
    codec => "json_lines"
  }
}
不幸的是,这种方法根本不起作用。我一直在尝试调试这个,但是日志并没有显示太多有用的东西。I事件试图将该液滴移出if,但仍在记录所有事件

答复如下:

所以我的问题是: 1.我不完全理解filebeat和logstash是如何工作的 2.我查看了旧版本中的示例代码

在较新版本中,filebeat中传递的额外字段将被压入fields键下。除此之外,在我的配置中,在_root:true下有字段_,但不知道它真正的功能

因此,我在filebeat配置中删除了\u root:true下的关键字段,\u,然后一切都正常,因为现在过滤器中的if实际上正常工作了。

尝试以下方法:

input {
  beats {
    port => 5044
    host => "localhost"
  }
}

output {
  if "404" != [nginx][access][response_code] {
    lumberjack {
      hosts => ["listener.logz.io"]
      port => 5006
      ssl_certificate => "/usr/share/logstash/keys/TrustExternalCARoot.crt"
      codec => "json_lines"
    }
}
}
顺便说一下,您可以使用:for Logstash 5.1调试Logstash配置+

/usr/share/logstash/bin/logstash --config.test_and_exit -f <the config file/folder>
原因是,如果您不这样做,则可能无法访问[nginx][access][response_code]


这实际上应该是可行的。

哦,太好了,所以你把if放在了输出端。这让我们想知道滴滤器的用途是什么?也许我误解了它的工作原理?这只是另一种方式。您好,我会将您的答案标记为已接受。我的问题是另一个问题,我将编辑问题来描述它,但你的回答确实让我找到了问题。
    filter {
      if [fileset][module] == "apache2" {
         if [fileset][name] == "access" {
            grok {
                    match => { "message" => ["%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \[%{HTTPDATE:[apache2][access][time]}\] \"%{WORD:[apache2][access][method]} %{DATA:[apache2][access][url]} HTTP/%{NUMBER:[apache2][access][http_version]}\" %{NUMBER:[apache2][access][response_code]} %{NUMBER:[apache2][access][body_sent][bytes]}( \"%{DATA:[apache2][access][referrer]}\")?( \"%{DATA:[apache2][access][agent]}\")?",
                      "%{IPORHOST:[apache2][access][remote_ip]} - %{DATA:[apache2][access][user_name]} \\[%{HTTPDATE:[apache2][access][time]}\\] \"-\" %{NUMBER:[apache2][access][response_code]} -" ] }
                  }
    }
  }
}