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

问题

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

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

Filebeat——manage multiline message

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

multiline.pattern

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

multiline.negate

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

multiline.match

指定Filebeat如何合并匹配的行,有两个值after和before

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

2be0b41eda73?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

如果negate设置为true,match设置为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

代表字单词边界不占位置,只用来指示位置

.*

尽可能多的任意匹配

(?(?\w+)\b.*)

整体匹配,存到query中,以一个或多个字符开头组成的单词,结果存到action中

(?:\n#\s+Time)?

内容可能有,也可能无,如果有,是接在一个换行之后,以 # 开头,隔着一个或多个空字符,然后是Time

.*$

任意匹配直到结尾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值