我有一个包含很多垃圾邮件字段(超过300个)的索引。它们都是嵌套的,看起来像这样:
kv.amp-1-234
kv.amp-1-abc
kv.amp-1-efg
所以我想进行过滤并使用remove_fields摆脱它们。 想要使用修剪过滤器,但我不能-他们不支持嵌套键删除。 而且我不能使用 过滤器{ 变异{ remove_fields
因为它不支持正则表达式。
我看到唯一的方法是通过红宝石过滤:
ruby {
code => "
event.to_hash.keys.each { |k|
if k.start_with?('[kv.amp-1][k]')
event.remove(k)
end
}
"
}
但是它不起作用。我只需要一个使用ruby过滤器删除嵌套键的示例(不需要regex,因为start_with?就足够了)
使用logstash 5.4.2
整个配置文件:
input {
kafka {
topics => "gelfEvents"
bootstrap_servers => "elk.sonic-dev.us-east-1:9092"
group_id => "gelfEventsCG-elk"
# client_id => ""
tags => [ "gelf2kafka" ]
codec => json { charset => "UTF-8" }
}
}
filter {
if "gelf2kafka" in [tags] {
mutate {
rename => { "short_message" => "message" }
rename => { "host" => "[host][name]" }
}
ruby {
code => "event.to_hash.keys.each do |key| next unless key[0,1] == '_'; if key == '_' then event.remove(key); next; end; event.set(key[1..-1], event.remove(key)) end"
}
#trying stuff
# ruby {
# code => "
# event.to_hash.keys.each { |k|
# if k.start_with?('[tags][k]')
# event.remove(k)
# end
# }
# "
# }
date {
match => [ "timestamp", "UNIX" ]
remove_field => [ "timestamp" ]
# target => "timestamp_new"
}
translate {
field => "level"
destination => "level"
exact => true
regex => false
override => true
fallback => "no match for %{level}"
dictionary => [ "6", "INFO",
"4", "WARN",
"3", "ERROR",
"7", "DEBUG" ]
}
}
}
output {
if "gelf2kafka" in [tags] {
# stdout { codec => rubydebug }
elasticsearch {
# protocol => "http"
hosts => "localhost"
index => "logstash-gelf2kafka-%{+YYYY.MM.dd}"
flush_size => 100
idle_flush_time => 1
}
statsd {
host => "localhost"
namespace => "logstash"
sender => "_all" # "%{host}"
increment => "LogsKafka2ElasticSearchAll.gelfEvents.LinesSent"
}
}
}
答案 0 :(得分:0)
我将假定方括号是您要检查的字符串的一部分。如果是这样,您的问题是您没有将k
插值到字符串中。
这将是一个棘手的难题,因为您的代码已经在双引号字符串中,但这应该可以工作:
k.start_with?(%{[kv.amp-1][#{k}]})
我还要问您是否需要to_hash
调用,但这取决于event
是哪种对象。