起因:
我们线上的业务通常会部署到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日志收集最佳实践