美文网首页ELK文集
Filebeat合并多行日志(以mysql慢查询日志为例)

Filebeat合并多行日志(以mysql慢查询日志为例)

作者: JensenWong | 来源:发表于2018-05-30 16:51 被阅读2次

    问题

    对于像Mysql的慢查询日志和Java日志这种多行日志怎么去配置Filebeat去合并多行日志呢

    本文以Mysql的慢查询日志为例

    Filebeat——manage multiline message

    首先我们先了解下Filebeat在合并多行日志上有哪些配置选项

    multiline.pattern
    指定正则表达式去匹配指定的行,例如multiline.pattern: '^\[',意思是去匹配以[开头的行

    multiline.negate
    定义pattern是否被否认,默认值是false,若为true,意思是对上面的匹配进行反转(就是实际去匹配不以pattern的行)

    multiline.match
    指定Filebeat如何合并匹配的行,有两个值afterbefore

    其实这个三个属性分开理解有点困难,下面结合官方doc中的例子去理解这三个属性之间的联系和作用


    如果negate设置为falsematch设置为after,Filebeat就会把不匹配的行作为行首,把匹配的行插入到行首后
    如果negate设置为truematch设置为after,Filebeat就会把匹配的行作为行首,把不匹配的行插入到行首后

    multiline.flush_pattern
    指定正则表达式去匹配指定的行作为multline-message的结束,刷新的内存,开始匹配新的多行

    multiline.max_lines
    指定合并最大行数

    multiline.timeout
    设定一个超时时间,在时间结束后,即使没有匹配到新pattern来启动新事件,Filebeat也会发送多行事件。默认值是5秒

    确认slow-query.log的格式

    不同版本的mysql,有不同的慢查询日志格式
    下面是我在用mysql版本的slow-query.log的格式

    # Time: 180531  9:04:26
    # User@Host: parke[parke] @  [192.168.0.37]  Id: 228857
    # Query_time: 1.374079  Lock_time: 0.000000 Rows_sent: 104930  Rows_examined: 104930
    SET timestamp=1527728666;
    SELECT /*!40001 SQL_NO_CACHE */ * FROM `sdb_b2c_order_items`; 
    

    Filebeat合并多行日志

    修改filebeat.yaml文件

    filebeat.prospectors:
    - type: log
      enabled: true
      close_rename: true
      close_remove: true
      close_inactive: 10m
      paths: ["/data/logs/mysql/slow-query.log"]
      scan_frequency: 1m
      backoff: 1s
      max_backoff: 10s
      backoff_factor: 2
      harvester_limit: 10
      multiline.pattern: '^(# Time)'
      multiline.negate: true
      multiline.match: after
      multiline.timeout: 5s
      fields:
        filename: mysql_slow
      fields_under_root: true
    

    Logstash解析slow-query.log

    修改logstash.conf文件

    filter {
    if [filename] == "mysql_slow" {
        grok {
          match => [ "message", "(?m)^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+%{WORD}?\s+\[%{IP:ip}\]\s+Id:\s+%{NUMBER:id}\n#\s+Query_time:\s+%{NUMBER:query_time:float}\s+Lock_time:\s+%{NUMBER:lock_time:float}\s+Rows_sent:\s+%{NUMBER:rows_sent:int}\s+Rows_examined:\s+%{NUMBER:rows_examined:int}\nSET\s+timestamp=%{NUMBER:timestamp};\n%{GREEDYDATA:sql}" ]
        }
        date {
          match => [ "unixtime", "UNIX" ]
          target => "@timestamp"
          remove_field => "unixtime"
        }
      }
    }
    

    以下举一些正则匹配的例子

    Item Comment
    (?m) 打开多行模式的开关
    ^# 以 # 字符顶头
    \s+ 匹配一个或多个空字符
    \s* 0个或多个空字符
    %{USER:user} 以 USER 模式进行正则匹配,结果放在user中
    [[^]]+] 以 [ 开头 以]结尾,内容是由一个或多个不是 ] 的字符填充而成
    %{NUMBER:id:int} 以 NUMBER 模式进行正则匹配,为整数型,结果放在id中
    \n 匹配换行符
    %{NUMBER:query_time:float} 以 NUMBER 模式进行正则匹配,为浮点型,结果放在query_time中
    (?:use\s+%{USER:usedatabase};\s*\n)? 这个匹配可能有,也可能无,如果有,就是以use开头,若干空字符,以 USER 模式进行正则匹配,结果放在usedatabase中,然后紧接着 ; ,后面是0个或多个空字符,然后是换行,注意:如果有是整体有,如果无,是整体无
    \b 代表字单词边界不占位置,只用来指示位置
    .* 尽可能多的任意匹配
    (?<query>(?<action>\w+)\b.*) 整体匹配,存到query中,以一个或多个字符开头组成的单词,结果存到action中
    (?:\n#\s+Time)? 内容可能有,也可能无,如果有,是接在一个换行之后,以 # 开头,隔着一个或多个空字符,然后是Time
    .*$ 任意匹配直到结尾

    相关文章

      网友评论

        本文标题:Filebeat合并多行日志(以mysql慢查询日志为例)

        本文链接:https://www.haomeiwen.com/subject/lvfxsftx.html