所以我使用标准的ELK堆栈来分析Apache访问日志,这种方式运行良好,但是我希望使用KV过滤器将URL参数分解为字段,以便让我写更好的查询。
我的问题是我正在分析的应用程序有“缓存破坏”的问题。动态生成的参数,导致数万个字段,每个字段发生一次。 ElasticSearch似乎对此有严重的麻烦,它们对我没有任何价值,所以我想删除它们。以下是模式的示例
GET /page?rand123PQY=ABC&other_var=something
GET /page?rand987ZDQ=DEF&other_var=something
在上面的示例中,我要删除的参数开始了#rand'。目前我的logstash.conf使用grok从访问日志中提取字段,然后用kv提取查询字符串参数:
filter {
grok {
path => "/var/log/apache/access.log"
type => "apache-access"
}
kv {
field_split => "&?"
}
}
有没有办法可以过滤出与模式rand[A-Z0-9]*=[A-Z0-9]*
匹配的任何字段?我见过的大多数示例都是按照确切名称定位字段,我无法使用。我确实想知道将请求字段重新编写到一个新字段中,在其上运行KV,然后将其删除。那会有用吗?
答案 0 :(得分:7)
如果 感兴趣的字段集已知并且定义明确,则可以为kv filter设置target
,将感兴趣的字段移至顶层带有mutate filter的消息,并使用嵌套的键/值对删除该字段。我认为这几乎就是你最后提出的建议。
或者您可以使用ruby filter:
filter {
ruby {
code => "
event.to_hash.keys.each { |k|
if k.start_with?('rand')
event.remove(k)
end
}
"
}
}
答案 1 :(得分:2)
我知道这已经过时并且已经得到了解答,但是对于任何在2017年进行调查的人来说。有一个名为prune
的插件允许您根据包括模式在内的差异标准进行修剪。
prune {
blacklist_names => ["[0-9]+", "unknown_fields", "tags"]
}