综合需要考虑的问题
- 最好只处理指定namespace的日志
- 非标准日志的处理(SQL和Gin的日志),考虑忽略非标准日志
- 加入k8s metadata
- 按名称空间加日志(%{[k8s]}-%{+yyyy.MM.dd})
- 删除不需要的字段
- 直连ES
- 消息主体替换根节点的message,level和time提到根节点
安装前系统配置
https://docs.fluentd.org/installation/before-install
安装指南
https://docs.fluentd.org/installation/install-by-rpm
官方的rpm方式安装非常简单,但是经常一天的尝试,失败了。最开始是找不到原因,es并没有收到任何日志,一直在查source或match的配置问题,后来发现是因为source配置的k8s容器日志路径/var/log/containers/*.log,td-agent并没有读取权限,属性用户和组都是root,但权限是777,手工读取日志文件,确实报没有权限,折腾了一天
选择了卸载rpm,改用docker方式运行,发现也不行,最终改成k8s方式运行可以! 期间遇到kibana一直提示创建索引问题,又折腾了大半天,结果按官方解答,重启kibana就解决了
中间考虑过logrus -> es,或logrus -> fluent的方案,但因会造成开发和生产环境的人为差异而放弃
关于filebeat和fluentd对选型
- 就开发语言选择上,理论应该更倾向于filebeat(使用go,而fluent是ruby)
- Github starts上,fluentd比filebeat多了不到1000,约10%(2021-4-7)
- fluentd是CNCF的项目
- fluentd在k8s官方有示例yaml(这个信息也许预示了k8s更倾向fluentd吧
最终选择了fluentd,虽然filebeat也不错:commit更多、tag更多、issue更多(这个姑且算理由吧)、开发成员更多,但是第3和第4条理由太强了~~~
折腾了几天filebeat,放弃了,两个都不折腾了!
filebeat放弃理由:对于json格式解析一直报错,都是按官方说法配置的!
经过反复折腾,重新整理思路,终于用filebeat搞定!不需要multiline,也不需要decode_json_fields,可以直接向ES发送数据,不需要Logstash,只是根据k8s namespace自动创建索引暂时未能实现,不过也不重要了!
k8s官方配置:https://github.com/elastic/beats/blob/master/deploy/kubernetes/filebeat-kubernetes.yaml
使用ecs-logrus:https://www.elastic.co/guide/en/ecs-logging/go-logrus/current/setup.html
官方文档: