Filebeat合并多行日志(以mysql慢查詢(xún)?nèi)罩緸槔?/h2>

問(wèn)題

對(duì)于像Mysql的慢查詢(xún)?nèi)罩竞蚃ava日志這種多行日志怎么去配置Filebeat去合并多行日志呢

本文以Mysql的慢查詢(xún)?nèi)罩緸槔?/p>

Filebeat——manage multiline message

首先我們先了解下Filebeat在合并多行日志上有哪些配置選項(xiàng)

multiline.pattern
指定正則表達(dá)式去匹配指定的行,例如multiline.pattern: '^\[',意思是去匹配以[開(kāi)頭的行

multiline.negate
定義pattern是否被否認(rèn),默認(rèn)值是false,若為true,意思是對(duì)上面的匹配進(jìn)行反轉(zhuǎn)(就是實(shí)際去匹配不以pattern的行)

multiline.match
指定Filebeat如何合并匹配的行,有兩個(gè)值afterbefore

其實(shí)這個(gè)三個(gè)屬性分開(kāi)理解有點(diǎn)困難,下面結(jié)合官方doc中的例子去理解這三個(gè)屬性之間的聯(lián)系和作用


如果negate設(shè)置為falsematch設(shè)置為after,F(xiàn)ilebeat就會(huì)把不匹配的行作為行首,把匹配的行插入到行首后
如果negate設(shè)置為true,match設(shè)置為after,F(xiàn)ilebeat就會(huì)把匹配的行作為行首,把不匹配的行插入到行首后

multiline.flush_pattern
指定正則表達(dá)式去匹配指定的行作為multline-message的結(jié)束,刷新的內(nèi)存,開(kāi)始匹配新的多行

multiline.max_lines
指定合并最大行數(shù)

multiline.timeout
設(shè)定一個(gè)超時(shí)時(shí)間,在時(shí)間結(jié)束后,即使沒(méi)有匹配到新pattern來(lái)啟動(dòng)新事件,F(xiàn)ilebeat也會(huì)發(fā)送多行事件。默認(rèn)值是5秒

確認(rèn)slow-query.log的格式

不同版本的mysql,有不同的慢查詢(xún)?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) 打開(kāi)多行模式的開(kāi)關(guān)
^# 以 # 字符頂頭
\s+ 匹配一個(gè)或多個(gè)空字符
\s* 0個(gè)或多個(gè)空字符
%{USER:user} 以 USER 模式進(jìn)行正則匹配,結(jié)果放在user中
[[^]]+] 以 [ 開(kāi)頭 以]結(jié)尾,內(nèi)容是由一個(gè)或多個(gè)不是 ] 的字符填充而成
%{NUMBER:id:int} 以 NUMBER 模式進(jìn)行正則匹配,為整數(shù)型,結(jié)果放在id中
\n 匹配換行符
%{NUMBER:query_time:float} 以 NUMBER 模式進(jìn)行正則匹配,為浮點(diǎn)型,結(jié)果放在query_time中
(?:use\s+%{USER:usedatabase};\s*\n)? 這個(gè)匹配可能有,也可能無(wú),如果有,就是以u(píng)se開(kāi)頭,若干空字符,以 USER 模式進(jìn)行正則匹配,結(jié)果放在usedatabase中,然后緊接著 ; ,后面是0個(gè)或多個(gè)空字符,然后是換行,注意:如果有是整體有,如果無(wú),是整體無(wú)
\b 代表字單詞邊界不占位置,只用來(lái)指示位置
.* 盡可能多的任意匹配
(?<query>(?<action>\w+)\b.*) 整體匹配,存到query中,以一個(gè)或多個(gè)字符開(kāi)頭組成的單詞,結(jié)果存到action中
(?:\n#\s+Time)? 內(nèi)容可能有,也可能無(wú),如果有,是接在一個(gè)換行之后,以 # 開(kāi)頭,隔著一個(gè)或多個(gè)空字符,然后是Time
.*$ 任意匹配直到結(jié)尾
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容