Key-Value 切分

在很多情况下,日志内容本身都是一个类似于 key-value 的格式,但是格式具体的样式却是多种多样的。logstash 提供 filters/kv 插件,帮助处理不同样式的 key-value 日志,变成实际的 LogStash::Event 数据。

配置示例

  1. filter {
  2. ruby {
  3. init => "@kname = ['method','uri','verb']"
  4. code => "
  5. new_event = LogStash::Event.new(Hash[@kname.zip(event.get('request').split('|'))])
  6. new_event.remove('@timestamp')
  7. event.append(new_event)
  8. "
  9. }
  10. if [uri] {
  11. ruby {
  12. init => "@kname = ['url_path','url_args']"
  13. code => "
  14. new_event = LogStash::Event.new(Hash[@kname.zip(event.get('uri').split('?'))])
  15. new_event.remove('@timestamp')
  16. event.append(new_event)
  17. "
  18. }
  19. kv {
  20. prefix => "url_"
  21. source => "url_args"
  22. field_split => "&"
  23. remove_field => [ "url_args", "uri", "request" ]
  24. }
  25. }
  26. }

解释

Nginx 访问日志中的 $request,通过这段配置,可以详细切分成 method, url_path, verb, url_a, url_b

进一步的,如果 url_args 中有过多字段,可能导致 Elasticsearch 集群因为频繁 update mapping 或者消耗太多内存在 cluster state 上而宕机。所以,更优的选择,是只保留明确有用的 url_args 内容,其他部分舍去。

  1. kv {
  2. prefix => "url_"
  3. source => "url_args"
  4. field_split => "&"
  5. include_keys => [ "uid", "cip" ]
  6. remove_field => [ "url_args", "uri", "request" ]
  7. }

上例即表示,除了 url_uidurl_cip 两个字段以外,其他的 url_* 都不保留。