• Logstash grok的使用


    常用的一些选项

    logstash中grok正则过滤的功能十分强大,如果用好了grok插件的话,基本可以处理99.99%的消息。官方文档上有一些例子,以及给了一个github的地址,上面有很多grok的内置变量,合理的使用,可以让我们的正则表达式既强大又简洁。

    ELK官方文档

    github地址

    基本大部分的插件都可以通过上面的示例去找到,下面我列举一些,我比较经常用到的

    • 时间

      # IOS8601格式的时间 2021-06-28T14:28:57+08:00 2021-06-28 14:28:57+08:00
      TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
      # 28/Jun/2021:14:34:29 +0800
      HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
      
      # 一般上述的两种时间格式比较多
      
      # 06/28/2021  06-28-2021
      DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
      # 28/06/2021 28.06.2021 28-06-2021
      DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
      
      # 看了上面内置的一些之后,其实如果发现跟我们的日志格式不一样,又不想写很复杂的正则的话,我们可以自己通过这些小的变量去组装,类似
      # 2021/06/28 14:45:42
      # (?<timestamp>%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME})
      
    • ip

      IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?
      IPV4 (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])
      IP (?:%{IPV6}|%{IPV4})
      

      日志等级

      # [error]
      LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo?(?:rmation)?|INFO?(?:RMATION)?|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
      

      数字

      # 1.1
      NUMBER (?:%{BASE10NUM})
      
      # 1
      INT (?:[+-]?(?:[0-9]+))
      
      NUMBER与INT的区别在于,INT只能匹配整数,而NUMBER可以匹配小数
      

      字符串

      # GET 
      WORD  w+
      

      uri

      # /abc/dd
      URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%&_-]*)+
      # http://192.168.0.55:7821/kxqp/websocket
      URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATH}(?:?%{URIQUERY})?)?
      

      其他

      # 有的时候已经匹配了自己想要的所有的数据了,后面的的部分想要全部赋值给一个变量,或者全部丢弃
      GREEDYDATA .*
      DATA  .*?
      

      e.g. 简单示例

      # 2021/06/28 14:45:42 [error] 14820#0: *99336633 connect() failed (111: Connection refused) while connecting to upstream, client: 139.15.22.92, server: , request: "GET /aq/dd HTTP/1.1", upstream: "http://192.168.0.55:7821/kxqp/websocket", host: "abc.dd.game.cn:8899"
      
      
      (?<timestamp>%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME}) [%{LOGLEVEL:loglevel}] %{NUMBER}#%{NUMBER}: *%{NUMBER} %{DATA:action}, client: %{IP:clientip}, server: %{DATA:server}, request: "%{WORD:requestMethod} %{URIPATH:uri} HTTP/%{NUMBER:httpVersion}", (upstream: "%{URI:upUri}", )?host: %{GREEDYDATA}
      

      *需要转义,否则会当作正则中的*

      示例我匹配的是nginx的错误日志,你可以自己试一试是否能匹配成功,upstream在你使用的时候才会出现,所以这里通过()?表示出现0或者1次

    通过kibana的grok debugger工具可以验证正则的正确性

  • 相关阅读:
    java中float内存存储原理
    java生产者消费者模式代码示例
    数据库死锁解决方案
    eclipse插件FindBugs使用笔记
    cmd查看环境变量
    springsECURITYDemo依赖
    2.27上课使用页面
    激活idea
    麻蛋 居然在jdk 问题上弱智
    Erek
  • 原文地址:https://www.cnblogs.com/xll970105/p/14944602.html
Copyright © 2020-2023  润新知