事實上,在sidecar裏使用fluentd來收集日誌是非常不錯的選擇,通過對日誌文件的監控,將文件定時發到ES裏,通過kibana去讀取;而你的日誌如果使用tail的話,默認是一行一行讀取的,這對於多行信息的日誌,是非常不友好的,所以今天寫一個多行日誌讀取的方法。
sidecar就是k8s裏爲pod提供的一個插件,類似於給摩托車加一個連鬥,所以又叫連鬥模式,即一個pod包含了兩個容器,一個是主程序,一個是fluentd程序,如圖:
需要用正則
我們在使用時,需要註冊,這個多行需要有正則匹配的,這取決於你的日誌輸出格式,今天我寫的日誌格式如下:
2020-09-25 16:55:29.555 [XNIO-1 task-1] INFO : hello world!
針對於上面的日誌格式,我們的fluentd的配置如下
<source>
type tail
path /var/log/*.log
pos_file /var/log/*.log.pos
tag test
refresh_interval 120
format multiline
multiline_flush_interval 5s
format_firstline /\d{4}-\d{1,2}-\d{1,2}/
format1 /^(?<access_time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}) \[(?<thread>.*)\] (?<level>[^ ]*) (?<message>.*)/
</source>
<match **>
@id elasticsearch
@type elasticsearch
index_name fluentd
type_name _doc
host 192.168.60.136
port 9200
include_tag_key true
tag_key @log_name
logstash_format true
flush_interval 10s
logstash_prefix test
</match>
需要注意的事,由於使用到了多行文本的收集,所以你的fluentd客戶端需要安裝對應的插件,我們這邊用的是docker方式,插件已經裝好了。
這個技術我研究和嘗試了很多次,最後還是成功了!
參考:
https://docs.fluentd.org/parser/regexp
https://github.com/fluent/fluentd/issues/1513