重温战场 发表于 2019-1-29 13:47:28

日志分析logstash插件

      一般系统或服务生成的日志都是一大长串。每个字段之间用空格隔开。logstash在获取日志是整个一串获取,如果把日志中每个字段代表的意思分割开来在传给elasticsearch。这样呈现出来的数据更加清晰,而且也能让kibana更方便的绘制图形。
      Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。
  

  
  grok表达式
  下面针对Apache日志来分割处理
  
filter {
if == "apache" {
    grok {
      match => ["message" => "%{IPORHOST:addre} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referer}|-)\" \"%{GREEDYDATA:User_Agent}\""]
      remove_field => ["message"]
    }
    date {
      match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
}
}  下面是apache日志
192.168.10.97 - - "GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"  
  日志中每个字段之间空格隔开,分别对应message中的字段。
  如:%{IPORHOST:addre}--> 192.168.10.197
  

  但问题是IPORHOST又不是正则表达式,怎么能匹配IP地址呢?
  因为IPPRHOST是grok表达式,它代表的正则表达式如下:
IPV6 ((({1,4}:){7}({1,4}|:))|(({1,4}:){6}(:{1,4}|((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3})|:))|(({1,4}:){5}(((:{1,4}){1,2})|:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3})|:))|(({1,4}:){4}(((:{1,4}){1,3})|((:{1,4})?:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){3}(((:{1,4}){1,4})|((:{1,4}){0,2}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){2}(((:{1,4}){1,5})|((:{1,4}){0,3}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(({1,4}:){1}(((:{1,4}){1,6})|((:{1,4}){0,4}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:))|(:(((:{1,4}){1,7})|((:{1,4}){0,5}:((25|2\d|1\d\d|?\d)(\.(25|2\d|1\d\d|?\d)){3}))|:)))(%.+)?
IPV4 (? "/usr/local/logstash-2.3.4/ownpatterns/patterns"
      match => {
                "message" => "%{APACHE_LOG}"
                }
      remove_field => ["message"]
    }
    date {
      match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
}
}  patterns_dir为自定义的grok表达式的路径。
  自定义的patterns中按照logstash自带的格式书写。
  APACHE_LOG %{IPORHOST:addre} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referer}|-)\" \"%{GREEDYDATA:User_Agent}\"
  我只是把apache日志匹配的grok表达式写入自定义文件中,简化conf文件。单个字段的正则表达式匹配你可以自己书写测试。
  参考:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html



页: [1]
查看完整版本: 日志分析logstash插件