在 Elasticsearch 中存储解析数据之前如何使用 Logstash 过滤数据
How to filter data with Logstash before storing parsed data in Elasticsearch
我了解 Logstash 用于聚合和处理日志。我有 NGIX 日志并将 Logstash 配置设置为:
filter {
grok {
match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
overwrite => [ "message" ]
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
geoip {
source => "clientip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "agent"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "weblogs-%{+YYYY.MM}"
document_type => "nginx_logs"
}
stdout { codec => rubydebug }
}
这会将非结构化日志解析为结构化形式的数据,并将数据存储到月度索引中。
我发现大部分日志是由 robots/web-crawlers 贡献的。在 python 中,我会通过以下方式过滤掉它们:
browser_names = browser_names[~browser_names.str.\
match('^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$', na=False)]
不过,我想用 Logstash 过滤掉它们,这样我就可以在 Elasticsearch 服务器中节省大量磁盘 space。有没有办法做到这一点?提前致谢!
在您的过滤器中,您可以要求删除 (https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html)。因为你已经有了你的模式,应该很快 ;)
感谢LeBigCat 的慷慨解囊。我通过在过滤器下添加以下内容解决了这个问题:
if [browser_names] =~ /(?i)^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$/ {
drop {}
}
(?i) 标志用于不区分大小写的匹配。
我了解 Logstash 用于聚合和处理日志。我有 NGIX 日志并将 Logstash 配置设置为:
filter {
grok {
match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
overwrite => [ "message" ]
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
geoip {
source => "clientip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "agent"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "weblogs-%{+YYYY.MM}"
document_type => "nginx_logs"
}
stdout { codec => rubydebug }
}
这会将非结构化日志解析为结构化形式的数据,并将数据存储到月度索引中。
我发现大部分日志是由 robots/web-crawlers 贡献的。在 python 中,我会通过以下方式过滤掉它们:
browser_names = browser_names[~browser_names.str.\
match('^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$', na=False)]
不过,我想用 Logstash 过滤掉它们,这样我就可以在 Elasticsearch 服务器中节省大量磁盘 space。有没有办法做到这一点?提前致谢!
在您的过滤器中,您可以要求删除 (https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html)。因为你已经有了你的模式,应该很快 ;)
感谢LeBigCat 的慷慨解囊。我通过在过滤器下添加以下内容解决了这个问题:
if [browser_names] =~ /(?i)^[\w\W]*(google|bot|spider|crawl|headless)[\w\W]*$/ {
drop {}
}
(?i) 标志用于不区分大小写的匹配。