Elasticsearch Logstash Filebeat 映射

Elasticsearch Logstash Filebeat mapping

我在使用 ELK Stack + Filebeat 时遇到问题。

Filebeat 正在向 Logstash 发送类似 Apache 的日志,Logstash 应该正在解析这些行。 Elasticsearch 应该将拆分数据存储在字段中,以便我可以使用 Kibana 将它们可视化。

问题: Elasticsearch 接收日志但将它们存储在单个 "message" 字段中。

所需的解决方案:

输入:

10.0.0.1 some.hostname.at - [27/Jun/2017:23:59:59 +0200]

ES:

"ip":"10.0.0.1"

"hostname":"some.hostname.at"

"timestamp":"27/Jun/2017:23:59:59 +0200"

我的 logstash 配置:

    input {

  beats {
    port => 5044
  }



}

filter { 


  if [type] == "web-apache" {
        grok {
            patterns_dir => ["./patterns"]
            match => { "message" => "IP: %{IPV4:client_ip}, Hostname: %{HOSTNAME:hostname}, - \[timestamp: %{HTTPDATE:timestamp}\]" }
            break_on_match => false
            remove_field => [ "message" ]
        }

        date {
            locale => "en"
            timezone => "Europe/Vienna"
            match =>  [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
        }

        useragent {
            source => "agent"
            prefix => "browser_"
        }
    }

    }

output {

    stdout {
       codec => rubydebug
    }

    elasticsearch {
             hosts => ["localhost:9200"]
         index => "test1"
             document_type => "accessAPI"
           }
}

我的 Elasticsearch 发现输出:

希望身边有哪位ELK高手能帮帮我。 先感谢您, 马蒂亚斯

你所说的 grok 过滤器在这里不起作用。

尝试使用:

%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]


不需要在字段名称前单独指定所需的名称(您不是要在此处格式化消息,而是要提取单独的字段),只需在中说明字段名称':' 后的括号将导致您想要的结果。

此外,使用覆盖功能代替 remove_field 消息。 更多信息在这里:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-options

最终看起来会像这样:

filter {
  grok {
    match => { "message" => "%{IPV4:client_ip} %{HOSTNAME:hostname} - \[%{HTTPDATE:timestamp}\]" }
    overwrite => [ "message" ]
  }
}

您可以在此处测试 grok 过滤器:
http://grokconstructor.appspot.com/do/match