起因:
我們線上的業務通常會部署到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. 總結
本文描述了完整的日誌收集過程, 希望對大家有幫助