共计 2939 个字符,预计需要花费 8 分钟才能阅读完成。
应用程序日志是由软件应用程序记录的事件文件,它一般包含错误,信息事件和警告。一个良好的日志系统有助于快速发现问题,定位问题,同时也为业务分析起到一定的作用。
传统 ELK 系统
ELK 系统是目前比较流行的日志解决方案,由 Elasticsearch、Logstash、Kibana 组成,目前三个组件都归属于 Elastic。
Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是用 Java 开发的,并在 Apache 许可证下作为开源软件发布。
自 2010 年发布以来,Elasticsearch 已迅速成为最受欢迎的搜索引擎,常用于日志分析,全文搜索和业务分析等业务场景。
Logstash 将日志收集后发送到 Elasticsearch 中进行存储,用户访问 Kibana 提供的 UI 界面查询数据。
Choerodon 中的日志系统
总览
和 ELK 类似,Choerodon 选用了 Elasticsearch 存储日志数据,并由 Kibana 展示数据。Choerodon 平台运行在 Kubernetes 平台之上,同时也管理多个 Kubernetes 集群,为了让日志系统尽可能的不影响业务系统,Choerodon 使用了比 Logstash 更轻量的由 C 语言编写的 fluent bit 替代采集端工具 Logstash。fluent bit 通过 Deamonset 的方式运行在 Kubernetes 集群中的每一个可调度的节点上,实时采集日志,发送到 Elasticsearch 中,一般情况下,从日志产生到 Kibana 中可以查看到的延迟不超过 1 秒钟。精简结构图如下:
先看一下查看界面:
通过搜索关键字 error 查询含有该关键字的日志,界面显示最近 15 分钟 gateway-helper 服务出现了三次 error 的日志信息,列表中为该日志的缩略信息,可以点击日志前面的小箭头展开查看完整的信息。
展开之后就可以看到更加详细的信息了。
PS:多行展示官方的 fluent bit 截止目前暂未良好的支持 docker 中的 json-file 日志,建议使用 Choerodon 定制 fluent bit。
Fluent bit vs Fluentd
Fluentd 和 Fluent Bit 项目均由 Treasure Data 创建和赞助,旨在解决日志的收集,处理和交付问题。
两个项目都有很多相似之处,Fluent Bit 完全基于 Fluentd 架构和一般设计的设计和经验。选择使用哪一个取决于最终需求,从架构角度可以考虑:
- Fluentd 是日志收集器,处理器和聚合器,使用 Ruby 和 C 构建。
- Fluent Bit 是一个日志收集器和处理器,它没有像 Fluentd 一样强大的聚合功能。在 Choerodon 日志方案聚合功能由 Elasticsearch 提供。Fluent bit 一般情况下占用内存要仅为 fluentd 十分之一以下。
类似于 Fluent bit 的组件还有很多如 Filebeat 等,Choerodon 也在关注各主流组件的更新,选择最合适的日志采集端工具。
如何自动收集日志
一般在采集日志的时候,为了更容易分析日志,需要将日志进行解析。下面的这个图中将 Java 应用的一条日志解析为 level,class,processid 和 msg 四个部分:
解析日志需要指定解析规则,Choerodon 部署界面可以为应用配置解析规则,当配置了解析规则后即表示该应用的日志需要按照配置的规则收集,部署界面如下图所示:
通过 mysql 这个解析规则解析该应用的日志,目前 Choerodon 日志解决方案中默认提供了 docker、mysql、tomcat、springboot 和 nginx 的日志解析规则,如果你认为需要添加其他通用的日志解析规则欢迎到 Choerodon 社区中建议。
在 Fluent-bit 中可以配置通配符 ”*”来收集匹配规则的日志,但是很多时候开发者希望在部署应用时指定是否收集日志。在 Choerodon 平台中,应用是运行在 Kubernetes 平台之上的,所以开发者可以通过给应用的部署集添加标签来表示需不要收集日志,再通过一个程序去读取标签的内容,自动修改 Fluent-bit 的配置就可以随心的控制是否需要收集日志了。如果需要默认收集所有应用的日志,排除部分日志可以使用 Fluent-bit 提供的 fluentbit.io/exclude 注解。
在日志中添加集群相关的信息
Choerodon 的服务运行在 Kubernetes 集群中,如果能够在查看日志的时候也能看到日志来自哪个服务器,属于哪个 Pod 就能够更快的定位和查找问题。
Fluent bit 提供了 Kubernetes 的 filter,通过赋予 Fluent bit 查询权限,它就能够自动的为每条日志附加集群的相关信息。
如何告警
收集日志之后开发者需要对某个关键字出现的次数进行告警,如 Exception 这个关键字在某服务中一分钟出现了 5 次以上,需要将这个消息通知给特定的人员。
在这之前大家先来了解一下 Choerodon 中的监控方案:
应用监控数据经 Prometheus 采集处理之后展示在 Grafana 中,告警信息通过 Alertmanager 发送给用户。因为在监控方案中已经有可用的告警机制,开发者只需要将日志系统中的内容转换为 Prometheus 可以采集的指标数据即可使用监控方案中的告警机制。
Elastalert 是用 Python 编写的 Elasticsearch 告警工具,通过配置一定时间间隔查询 elasticsearch 数据库,对比预设规则达到告警的目的,Choerodon 可以通过简单的改造 elastalert 实现将 elastalert 查询的结果转换为 Prometheus 的数据格式供 Prometheus 拉取。改造步骤分为以下几个部分:
- 引入 prometheusSDK:prometheus 提供了 Python 的 SDK, 简单的引入之后应用就具有了可以被监控的特性,可以选择监听指定端口已提供监控数据。
- 埋点:将更新监控数据的操作置于 elastalert 每次执行查询完成后已更新监控数据即可。
目前 Choerodon 正在用 Golang 开发新的日志监控工具,得益于 Golang 的特性,新的日志监控工具将以更低的内存消耗,更低的 cpu 占用和更稳定的运行状态为日志监控提供支持。
使用 Choerodon 认证登录 Kibana
如上所示,Kibana 作为日志查看界面,如果使用社区版 Kibana 是没有权限校验的,会存在一定风险,希望授权用户才能访问日志查询界面。为此 Choerodon 设计开发了一个认证代理服务,将无权限控制的 Kibana 放置于认证代理的后端,只有通过了认证,才能访问到 Kibana 的界面。如下图所示:
效果图:
现在,你已经了解 Choerodon 的日志方案,接下来就可以跟随着 Choerodon 官网部署尝试一下吧。
参考文献:
- https://zh.wikipedia.org/wiki/Elasticsearch
- https://docs.fluentbit.io/manual/about/fluentd_and_fluentbit
本篇文章出自 Choerodon 猪齿鱼社区董文启。