logstash 没有从节拍中读取日志类型字段

logstash not reading logtype field from beats

我在一个节点上有 logstash filebeat 和 elasticsearch 运行。

我试图让 logstash 识别标记为 "syslog" 的日志并将它们转储到名为 "syslog" 的索引中,但它似乎看不到标签,因为它们都进入了"uncategorized"索引(我的catch all默认索引)

这是我的节拍配置

/etc/filebeat/filebeat.yml
filebeat:
  prospectors:
    -
      paths:
        - /var/log/messages
      fields:
        type: syslog
output:
  logstash:
    hosts: ["localhost:9901"]

这是我的 logstash 配置文件

/etc/logstash/conf.d/logstash_server_syslog.conf
input {
    beats {
        port => "9901"
    }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  if [type] == "syslog" {
    elasticsearch {
      hosts => ["10.0.0.167:9200", "10.0.0.168:9200"]
      index => "syslog"
    }
  } else {
    elasticsearch {
      hosts => ["10.0.0.167:9200", "10.0.0.168:9200"]
      index => "uncategorized"
    }
  }
}

查看输出(带有 stdout{} 节)可以确认这一点,但我猜您错过了 the doc 的这一部分:

By default, the fields that you specify [in the 'fields' config'] will be grouped under a fields sub-dictionary in the output document. To store the custom fields as top-level fields, set the fields_under_root option to true.

使用 document_type 配置选项在 Filebeat 中设置自定义 type 字段。

filebeat:
  prospectors:
    - paths:
        - /var/log/messages
      document_type: syslog

这将设置 @metadata.type 字段以用于 Logstash,而自定义字段则不会。