業務日誌收集方案

起因:

我們線上的業務通常會部署到10幾臺或者幾十臺機器上,線上的日誌如果用salt執行命令遠程的grep已經是越來越不方便了,所以我們決定對日誌進行統一收集,管理

1. 選擇方案

我們業務日誌不算特別的多,因此不想方案過於複雜,並且公司內部已經有ES和kafaka集羣
因此可以選方案有
1) rsyslog + kafka + elasticsearch
2)fluentd + kafka + elasticsearch
我最終選擇了方案1:
a) 由於公司的服務器主要是centos, 默認已經安裝了rsyslog
b) Fluentd是JRuby開發的,而rsyslog是二進制程序
以前有過logstash的使用經歷,當日志量較大時,logstash會把CPU打的很高

感受:rsyslog的功能其實非常強大,
它所有配置都是從某個input獲取數據再發送到output(和logstask很像)
支持:
1) 文件 –> kafka
2) 文件 –> elasticsearch
3) tcp/udp –> 文件
4)文件 –> 其它主機(TCP/UDP)
input 和 output 是可以任意組合的
如果你不想搭建Elasticsearch和Kafka,完全可以把所有日誌收集到某個文件服務器
然後在這臺文件服務器上再使用logrotate,完全可以滿足日常的開銷

kafka只是用來做緩衝的,如果日誌沒有明顯的波峯,可以不使用kafka

2. 實施

2.1 統一日誌字段

我們多個業務項目,並且有Golang、Python等多種語言,爲了保證,入ES的數據格式一致,我們統一了日誌的字段,如下
* 所有字段都是比選的,如果沒有請留成空字符串*

字段 類型 是否必填 說明 備註
service string 業務標識 使用英文字符和下劃線,中劃線
name string logger名稱
level string 日誌級別 ERROR/INFO/DEBUG/WARNING
pathname string 文件全路徑
lineno int 在文件中的行號 如果沒有, 給默認值-1
msg string 消息體
task_id string 任務ID
log_date string 日誌時間 ES上的字段類型爲datetime
2017-01-01T00:00:00+0800

不同的業務和項目之間通過service字段區分

也就是我們要求業務在打日誌的時候以JSON格式打印到文件中,幷包含以上字段,這樣就可以很方便的被Rsyslog收集並,寫入Kakfa隊列,最後再入到ES中。
注意 程序可以打2份日誌,一份按原來格式入文件,一份以JSON格式寫文件供rsyslog使用

範例

這裏給一個Python 的範例項目供大家參考
https://github.com/vearne/json_log

2.2 Rsyslog的安裝和配置

1)安裝

查看版本
rsyslogd -version
rsyslog 需要 v8.7.x以後的版本
安裝rsyslogd
yum install rsyslog
yum install rsyslog-kafka
默認安裝的版本就已經是8.30.0

2) 添加配置文件

在/etc/rsyslog.d中添加各自的配置文件

# import modules
module(load="imfile")
module(load="omkafka")
# 將日誌文件中的數據原樣輸出到kafaka topic中
template(name="our_json" type="string" string="%msg%\n")
# 指定處理規則
ruleset(name="kafka_devops") {
    action (
        type="omkafka"
        template="our_json"
        topic="devops"
        broker=["192.168.2.100:9092"]
        errorFile="/var/log/kafka_error.log"
    )
    stop
}
# 輸入 
# File 爲待監測的文件,如果文件發生變化
# rsyslog 會把變化的部分發送到kafka相應的topic中
input(type="imfile" Tag="" File="/tmp/test.log" Ruleset="kafka_devops")

3) 重啓rsyslog 使配置生效

/etc/init.d/rsyslog restart

2.3 kafka日誌入ES

2.4 kibana

3. 總結

本文描述了完整的日誌收集過程, 希望對大家有幫助

參考資料

1.日誌系列–程序日誌處理挑戰與方案
2.Docker日誌收集最佳實踐

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章