問題
對于像Mysql的慢查詢?nèi)罩竞蚃ava日志這種多行日志怎么去配置Filebeat去合并多行日志呢
本文以Mysql的慢查詢?nèi)罩緸槔?/p>
Filebeat——manage multiline message
首先我們先了解下Filebeat在合并多行日志上有哪些配置選項
multiline.pattern
指定正則表達式去匹配指定的行煤率,例如multiline.pattern: '^\['
,意思是去匹配以[
開頭的行
multiline.negate
定義pattern是否被否認宜雀,默認值是false
辫呻,若為true
晦溪,意思是對上面的匹配進行反轉(zhuǎn)(就是實際去匹配不以pattern的行)
multiline.match
指定Filebeat如何合并匹配的行,有兩個值after
和before
其實這個三個屬性分開理解有點困難儿礼,下面結(jié)合官方doc中的例子去理解這三個屬性之間的聯(lián)系和作用
如果negate
設(shè)置為false
板祝,match
設(shè)置為after
,F(xiàn)ilebeat就會把不匹配的行作為行首甥桂,把匹配的行插入到行首后
如果negate
設(shè)置為true
柿究,match
設(shè)置為after
,F(xiàn)ilebeat就會把匹配的行作為行首黄选,把不匹配的行插入到行首后
multiline.flush_pattern
指定正則表達式去匹配指定的行作為multline-message的結(jié)束蝇摸,刷新的內(nèi)存,開始匹配新的多行
multiline.max_lines
指定合并最大行數(shù)
multiline.timeout
設(shè)定一個超時時間办陷,在時間結(jié)束后貌夕,即使沒有匹配到新pattern來啟動新事件,F(xiàn)ilebeat也會發(fā)送多行事件民镜。默認值是5秒
確認slow-query.log的格式
不同版本的mysql啡专,有不同的慢查詢?nèi)罩靖袷?br> 下面是我在用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) | 打開多行模式的開關(guān) |
^# | 以 # 字符頂頭 |
\s+ | 匹配一個或多個空字符 |
\s* | 0個或多個空字符 |
%{USER:user} | 以 USER 模式進行正則匹配,結(jié)果放在user中 |
[[^]]+] | 以 [ 開頭 以]結(jié)尾制圈,內(nèi)容是由一個或多個不是 ] 的字符填充而成 |
%{NUMBER:id:int} | 以 NUMBER 模式進行正則匹配们童,為整數(shù)型,結(jié)果放在id中 |
\n | 匹配換行符 |
%{NUMBER:query_time:float} | 以 NUMBER 模式進行正則匹配鲸鹦,為浮點型慧库,結(jié)果放在query_time中 |
(?:use\s+%{USER:usedatabase};\s*\n)? | 這個匹配可能有,也可能無亥鬓,如果有完沪,就是以use開頭,若干空字符,以 USER 模式進行正則匹配覆积,結(jié)果放在usedatabase中听皿,然后緊接著 ; ,后面是0個或多個空字符宽档,然后是換行尉姨,注意:如果有是整體有,如果無吗冤,是整體無 |
\b | 代表字單詞邊界不占位置又厉,只用來指示位置 |
.* | 盡可能多的任意匹配 |
(?<query>(?<action>\w+)\b.*) | 整體匹配,存到query中椎瘟,以一個或多個字符開頭組成的單詞覆致,結(jié)果存到action中 |
(?:\n#\s+Time)? | 內(nèi)容可能有,也可能無肺蔚,如果有煌妈,是接在一個換行之后,以 # 開頭宣羊,隔著一個或多個空字符璧诵,然后是Time |
.*$ | 任意匹配直到結(jié)尾 |