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
我在使用 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