使用 Elastic 可观测性实现云原生应用监控(2/4)
本篇文章将学习如何使用 Fluent Bit 采集 Kubernetes 集群的应用日志,并将日志数据输出到ElasticSearch中,使用Kibana将其可视化出来。日志收集工具还有很多,如:Fluentd,Filebeat,Promtail等等。其中 Fluent Bit,Fluentd和 Filebeat 都使用过,基本上都能满足项目上对于日志采集的需求。个人比较首推Fluent Bit,主要是因为其资源占用非常少,采集效率高,设计优雅,配置简单。可以看下下图中,Fluent Bit 的 Data pipeline:
Fluent Bit vs Fluentd vs FileBeat
三款日志采集工具的资源占用情况如下:
以下是官方Fluentd和Fluent Bit的对比图:
Fluent Bit 安装
修改 Fluent Bit 官方Helm Values 文件,并保存为:fluent-bit-values.yaml
:
安装成功后:
在Kibana中验证日志采集
执行 test-pod.yaml
文件,方便使用Kibana查看日志:
可以看到Fluent Bit开始监听该容器,并采集日志:
在Kibana上添加Index Pattern
登陆在第一篇中已经安装好的 Kibana,添加 Index Pattern
:
1)填写 Index Pattern Name
2)配置 time field:
3)添加成功:
接下来在Discover
中,选择Index:k8s-dev
查看日志:
测试多行日志
运行如下我准备好的镜像,里面会自动打印正常日志和堆栈错误日志:
kubectl run -it --rm k8s-example-service --image=amuguelove/example-service:2021-07-19-232202-master --restart=Never
查看上图中第二条日志的详情,可以在stack_trace
字段看到异常堆栈的详细信息:
到这里日志采集系统就到这里结束了。日志采集工具选择哪一种需要结合项目的实际情况,就目前来说Fluent Bit
的插件比较少,支持目前比较主流的一些数据存储,如ElasticSearch,Kafaka,Loki等。
最后,说一下关于多行日志的问题。在实际项目中最关键的难点还是在如何采集多行日志,有的做法是使用采集工具的插件,先识别第一行日志的前缀,然后正则匹配剩下的部分,个人不是特别看好这种方式,1)是采集效率低,损耗性能;2)通用性不高,因为不同语言的多行日志的规则不同,如PHP,Ruby,Java等,它们的异常格式都不同,无法使用统一的正则去匹配。
个人比较推荐的方式是项目本身通过JSON
的格式去输出项目日志,1)避免了多行日志的问题,2)可以在ElasticSearch
中直接生成Index,方便快速查询。
Reference
Elastic 官网:https://www.elastic.co
Elastic 可观测性:https://www.elastic.co/cn/observability
Fluent Bit 官网:https://fluentbit.io/
Fluentd 官网:https://www.fluentd.org/
FileBeat 官网:https://www.elastic.co/beats/filebeat