因此,我使用标准的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,然后将其删除。那行得通吗?
filter { grok { path => "/var/log/apache/access.log" type => "apache-access" } kv { field_split => "&?" } }
rand[A-Z0-9]*=[A-Z0-9]*
如果字段集,你的 _是_感兴趣的是已知的和明确的,你可以设置target为KV过滤器,用移动有趣的领域,以邮件的顶层发生变异过滤器,并与套叠的键/值对删除字段。我认为这几乎是您最后的建议。
target
另外,您可以使用ruby过滤器:
filter { ruby { code => " event.to_hash.keys.each { |k| if k.start_with?('rand') event.remove(k) end } " } }