最近公司想要统一管理各个项目的日志,也为以后日志可视化查询做一个铺垫。经过筛选,选择了fluentd来做日志的收集转发工作,预想利用EFK来做日志收集、查询、可视化的方案。
啥?你问我为啥不用Logstash,可参考文章Fluentd vs. Logstash: A Comparison of Log Collectors
,两者差异并不大,Fluentd所占内存较小、社区更活跃。
Fluentd是什么?能解决什么问题?
官网简介: Fluentd是一个用于统一日志层的开源数据收集器。Fluentd允许您统一数据收集和使用,以便更好地使用和理解数据。Fluentd是云端原生计算基金会(CNCF)的成员项目之一,遵循Apache 2 License协议
这我们应用中,Fluentd负责从游戏服务器收集日志信息,将数据流交给后续数据存盘、查询工具。换句话说,Fluentd不负责生产数据、不负责存储数据,只是数据的搬运工。
- 使用JSON进行统一日志记录:Fluentd尝试尽可能地将数据结构化为JSON:这允许Fluentd 统一处理日志数据的所有方面:收集,过滤,缓冲和跨多个源和目标(统一日志层)输出日志。使用JSON可以更轻松地进行下游数据处理,因为它具有足够的结构,可以在保留灵活模式的同时进行访问。
- 可插拔架构:Fluentd拥有灵活的插件系统,允许社区扩展其功能。我们的500多个社区贡献插件连接了数十个数据源和数据输出。通过利用插件,您可以立即开始更好地使用日志。
- 所需的资源较少: Fluentd是用C语言和Ruby组合编写的,只需要很少的系统资源。vanilla实例运行30-40MB内存,可处理13,000个事件/秒/核心。
- 内置可靠性:Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。Fluentd还支持强大的故障转移功能,可以设置为高可用性。
注:fluentd-benchmark 对简单数据2014-02-20 17:20:55 +0900 [info]: plugin:out_flowcounter_simple count:500 indicator:num unit:second
测压结果是157148次/s
Fluentd解决数据流流向混乱的问题,通过在两者之间提供统一的日志记录层,从后端系统中分离数据源。
为什么要用Fluentd?
- 简单易用且灵活
- 开源
- 久经考验的可靠性和性能:5,000多家数据驱动型公司依靠Fluentd通过更好地使用和了解他们的日志数据来区分他们的产品和服务。
- 活跃的社区
- 与Logstash相比占用内存更少、社区更活跃,两者比较可参考Fluentd vs. Logstash: A Comparison of Log Collectors
人气情况:
- github fluent/fluentd start 6.8k
- npm fluent-logger weekly downloads 11,493
Fluentd的用户:
- Atlassian
- Microsoft
- amazon
- LINE
- PPTV
- …
fluentd安装
fluentd安装、启动可参考Fluent doc
Fluentd配置
- source: 数据源配置,可接受log-tail、http、tcp、udp等方式数据,
- filter: 数据过滤配置,对匹配的tag进行过滤
- match: 数据输出配置,对匹配的tag进行输出设置
1 | <source> |
Example input:1
$ echo '123456:awesome' | netcat 0.0.0.0 5170
Parsed result like below:1
{"field1":"123456","field2":"awesome}
1 | ## built-in TCP input |
fluentd更多配置请参考官网:https://docs.fluentd.org/v1.0/articles/config-file
fluent-logger配置
1 | import {configure, getLogger, shutdown} from 'log4js' |
如上配置,fluent-logger根据host、port连接fluentd,sharedKey作为连接认证
1 | logger.info({log_type: "create-room", uuid: 1112, room_id: 234, config: {cards: 16, chairs: 3}}); |
fluentd输出为:2018-10-18T10:50:38+08:00 example.your_keys.INFO {"timestamp":1539831038583.0,"category":"default","levelInt":20000,"levelStr":"INFO","context":{},"data":"log { log_type: 'create-room', uuid: 1112, room_id: 234 }"}
JavaScript fluent_logger缓存测试:
- 在fluentd关闭的情况下,logger输出20条日志,开启fluentd,fluent-logger会自动连接上fluentd,并将缓存的20条log发送至fluentd
- 正常连接fluentd,输出5条log。然后关闭fluentd,继续输出15条log,启动fluentd,fluent-logger自动连接上fluentd,并将缓存的15条log发送至fluentd
以上测试表明fluentd-logger在与fluentd丢失连接时,相关log暂先会缓存起来,并在重连时将缓存的log发送至fluentd。这个机制相当优秀,大大增加了安全性,不过要注意缓存是占用内存的,如果长时间连接不上fluentd,有内存耗尽的风险。
日志解决方案实战
可参考文档:基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用
未来展望
fluentd收集数据,可输出到hadoop中,利用数据做数据挖掘,可以实现很多有价值的目标。比如:
- 监测用户行为,针对流失较高的点,优化流失率,提高留存
- 监测消费行为,针对性营销,增加收入
- 异常检测,发现数据异常情况,第一时间发现服务器逻辑漏洞
- 消费数据挖掘,将消费者分类,同类消费者商品推荐
- 发现即将流失客户,重点给与相关优惠吸引策略
- 发现核心用户,重点关注
- …
参考资料
Fluent
fluentd-benchmark
Fluent doc
基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用
Fluentd vs. Logstash: A Comparison of Log Collectors