Filebeat + Redis 管理 LOG日志實踐
引用 轉載 請注明出處
某早上,領導怒吼聲遠遠傳來,空空的辦公區放大吼聲的“猙獰”程度。“xxxxxx ... ...重量級的日志管理工具不能用,xxxx不代表要自己造輪子。擁抱開源不只是口號,xxxx 要行動啊。... ...”
伴着少兒不宜嗶嗶嗶聲音,我開啟了探索輕量級開源日志管理工具航程。Filebeat等一干開源日志管理軟件進入我的視野。所有說:別人的憤怒時刻,也許是你發現新大陸開端。
之前提到的開源日志管理工具對比文章,本文適用於輕量級應用的日志管理。准確點說:如何使用Filebeat將java服務生成log采集到redis服務里。
Filebeat簡介
Filebeat
是elastic公司Beats平台系列產品中的一個日志采集、入庫、路由工具。官方提供功能列表:

簡言之,Filebeat簡化日志采集流程
,完美接入數據庫
,輕量級的開源產品
。輕量級符合我們期望,支持redis庫兼容我們當前服務,因此是我們的選擇。
本文是一篇教程,分為三部分:安裝、配置、運行。我們以這個順序進行介紹。注:因實施場景原因,Filebeat參數只涉及一部分。
關於版本說明
軟件版本號:
- Filebeat 6.5 (發布版)
- Linux x86_64 x86_64 GNU/Linux(os版本)
- redis_version: 5.0.0 (redis使用單節點模式,對可用性要求高要采用集群或sentinel模式)
如何安裝
Filebeat可安裝在主流的OS上,也支持docker、k8s方式進行部署,是典型的“麻雀雖小五臟俱全”的工具。
linux下安裝包是gz
的壓縮包。解壓即安裝:
tar xzvf filebeat-5.1.1-darwin-x86_64.tar.gz

讓我們分別介紹目錄的功能:
-
data
存儲Filebeat實例的uuid號,以及日志讀取歷史記錄。 -
kibana
接入kibana時,其提供可視化配置功能 -
logs
Filebeat 運行日志 -
module
module.d
配置參數:用於快速啟動功能 -
fields.yml
Filebeat提供針對不同組件,采集的參數名稱 類型等 -
filebeat
可執行文件 -
filebeat.reference.yml
Filebeat支持的參數手冊,所有支持配置參數都在這 -
filebeat.yml
啟動Filebeat需要配置文件。后面我們會重點解析
如何配置
下面描述如何怎樣配置,以及配置什么的問題。
-
Filebeat如何配置?
它提供三種配置方式:- Kibana 。它提供Filebeat參數配置界面。和其它管理功能。只是需要引入Kibana組件。
- Filebeat提供默認配置模塊,調用命令可以完成配置
- 按需手動配置文件
filebeat.yml
。程序猿喜歡的姿勢,也是我們認知軟件必經之路。我們以這種方式開始。
-
Filebeat配置哪些參數?
A.我們先說運行必須的、最小配置參數:
- 配置輸入數據類型(log-back生成的log)
filebeat.inputs:
- type: log #采集的數據格式 log enabled: true #激活log采集功能 paths: #采集路徑 - /var/log/*.log - /var/path2/*.log
注: 配置文件格式是yaml語言寫成,一種置標語言類似json
- 配置輸出數據參數
output.redis:
hosts: ["localhost"] #單機版 redis port: 6379 #port password: "my_password" #用戶名和密碼 key: "filebeat" # filebeat是數據的key db: 0 #數據寫入的庫
以上配置實現日志導入Redis的基本配置了。Filebeat又有哪些特殊參數?如何實現特色的需求哪?這些在其它配置中一一說明。
B. 其它配置說明
Filebeat輸出數據的格式是json。類似這樣:
{
"@timestamp": "2018-12-18T08:33:01.604Z", #采集時間 UTC
"@metadata": {....}, #描述beat的信息
"message": "日志內容", ### 數據主體
"source": "/var/log/run.log", #數據來源
"prospector": { "type": "log"},
"input": {"type": "log" }, #數據類型
"beat": {.... },
"host": {.... }, #系統信息 ip 系統版本 名稱等
"offset": 244 #偏移
}
輸出數據格式除包含數據主體message
外,還包括部分附加信息。對於不需要信息,如何進行過濾和轉換哪?這涉及Filebeat不算強大的數據過濾功能。
-
Filebeat數據過濾
-
過濾內容
exclude_lines: ['^INFO'] #exclude_lines關鍵字排除包含內容INFO include_lines: ['^ERR', '^WARN'] exclude_files: ['.gz/pre>] #排查壓縮文件 multiline.pattern: ^\[ #內容拼接,用戶異常堆棧輸出多行 拼接成一條 過濾內容和內容拼接,需要日志的格式是json,否則不生效
-
-
過濾json中輸出字段
Filebeat提供類似管道功能的處理器(processors),來指定生成字段,如下形式。
event -> filter1 -> event1 -> filter2 ->event2 ...
每次數據采集是一個事件,每個filter是一個處理器。讓我們自己定義一個處理器,如下:
processors:
- drop_fields:
when:
has_fields: ['source'] fields: ["input_type"]
功能:過濾器功能刪除字段(drop_fields),條件是當存在source字段時,刪除input_type字段。
更多Filebeat處理器和過濾器:鏈接
- 新增字段和列
fields: #字段的類型可以是不同類型或者 list,也可以自定義 level: debug review: 1 selfDefine: xxxxx
官方文檔提示fields 可以用來過濾 json文件,但我嘗試沒有成功
。
- Redis Key 如何設計
Filebeat提供有限度自定義redis key的功能。如果輸入數據是json格式,可以提取Json的字段作為redis的key。我們的key的定義是數據入庫時間。配置如下:
when.contains:
message: "INFO" key: "debug_list" # send to debug_list if `message` field contains DEBUG
令人遺憾是:時間不是北京時間,而是UTC時間。即不支持修改,且時間輸出有錯誤。
- 日志文件掃描參數
max_bytes: 10485760 #10M 緩存層,一次采集數據超出10M 數據會丟棄 harvester_buffer_size: 16384 #收割器大小 scan_frequency: 10s #文件掃描頻率 harvester_limit: 0 #采集器數量, 0 表示無限制 close_inactive: 5m #5m 無活動,關閉采集器
使用配置過程也表明:Filebeat易於配置和使用、過濾和轉換功能稍顯單一的組件。和logstash相比,各有側重,但對於大多數采集層而言已然夠用。
如何啟動
./filebeat -e #簡單到讓人發指啟動命令
后記和求助
Filebeat+ redis實踐過程完畢,我們發現作為配置非常簡單。甚至不需要關注輸入段內容、以及輸出端的redis,這才是中間件應有的樣子。
Filebeat不足輸出端支持的數據庫太少,社區也沒有計划支持更多的數據庫。
最近在看golang,萌生了寫一個輸出到postgres插件的想法。
如果開發輸出到postgres插件,有什么思路,希望各位路過的大俠指點一二。感激不盡。。
https://www.jianshu.com/p/29ec43327744