应用程序日志是由软件应用程序记录的事件文件, 它一般包含错误,信息事件和警告。一个良好的日志系统有助于快速发现问题,定位问题,同时也为业务分析起到一定的作用。
传统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猪齿鱼社区董文启。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。