新浪的處理日志流框架:Plog
Plog 是 "Parse Log" 的縮寫,是一套處理日志流的框架,日志流格式可以是Apache,nginx等常規意義的日志格式,也可以是自定義格式
受FlumeNG的啟發,我把整個工程分成了三個部分:source,channel ,sink,已經完成了主體的共有的可以抽象出來的功能,比如線程的同步互斥,消息的生產消費,處理時間間隔的控制,還有一些簡單的source,channel and sink函數
下面是一個簡單的配置文件:
[source]
#定義讀取數據的模塊名
source_module=file_source
#定義源文件
source_file=./test/plog_demo.log
#定義讀取文件的時間間隔,單位s
source_interval=5
[channel]
#定義解析數據的模塊名
channel_module=regrex_channel
#如是正則,定義正則規則
channel_filter_regex=([\w\d.\s,]{0,})\s([0-9.]+)\s(?P\d+|-)\s(\w+)\s\[([^\[\]]+)\s\+\d+\]\s"((?:[^"]|\")+)"\s(?P\d{3})\s(\d+|-)\s"((?:[^"]|\")+|-)"\s"(.+|-)"\s"((?:[^"]|\")+)"\s"(.+|-)"$
[sink]
#定義發送數據的時間間隔
interval=60
#定義計算與發送的模塊名
sink_module=zabbix_sink
sink_service=cacheL2
#定義需要的key
sink_zabbix_monitor_keys=200,300,400,500
#定義發送給zabbix寫數據的文件
sink_zabbix_send_file=/tmp/zabbix_send_info
#定義發送zabbix sender路徑
sink_zabbix_sender=/usr/bin/zabbix_sender
#定義zabbix的配置文件
sink_zabbix_conf=/etc/zabbix/zabbix_agentd.conf
[log_config]
#定義輸出log的格式,級別,路徑等,方便調試程序。
logging_format=%(asctime)s %(filename)s [funcname:%(funcName)s] [line:%(lineno)d] %(levelname)s %(message)s
logging_level=20
logging_filename=/tmp/plog.log 使用了ConfigParse來解析配置文件
source部分的設計思路
在這一部分,我們需要處理的是數據流的來源,他可能是file,可能是socket,可能是管道,但是我不關注你的數據來源格式是什么樣的,因為我無法滿足這些需要各式各樣的數據來源需求,而你的需要是什么樣的,你最清楚,那么你只要寫一個source的插件就可以了,名字隨意你定,你需要的是把你寫的那個插件的名字,寫到plog.conf里面,默認有讀取文件的file_source模塊,讀取管道的read_from_pipeline模塊,可以直接使用。
具體實例如下:
source_module=self-define-script-name
自定義source的具體實現,參看source module下的plog/source/youself_define_source.py
channel部分
在這個部分,主要是對數據流的處理,你同樣需要寫一個 Python的腳本,名字隨意你定,但是你需要寫到 plog.conf 中,默認有解析python正則的模塊可以直接使用,類似下方:
channel_module=filter_log
同樣的你需要實現的channel可以參見 plog/channel/youself_define_channel.py
sink 部分
在這個部分,你同樣需要寫一個Python腳本,他的名字同樣取決于你的個人喜好,你需要的是把你寫的那個插件的名字寫到plog.conf,例如下方:
sink_module=cacheL2get_monitor
同樣的你需要完成的腳本可以參見plog/sink/youself_define_sink.py
如何跑一個測試
下面的測試是讀取一個本地本件,解析,計算自己要想的結果發送到zabbix監控系統。
1.git clone https://github.com/SinaMSRE/Plog.git 2.cd ./Plog/test 3.sh gen_log.sh & 4.cd .. && python plog.py -c conf/plog.conf 5.you will see a file**/tmp/zabbix_send_info_test123**,its contents like followings: [xxxx@test Plog]$ cat /tmp/zabbix_send_info_test123 xxxx test123_300 0.000000 xxxx test123_200 59.000000 xxxx test123_500 0.000000 xxxx test123_400 0.000000