日志管理:快速发现和定位问题

    开始本文之前,我们先提问几个问题:

  1. 如果你的网站或者服务出现故障,是谁第一时间发现问题的?用户还是运维人员?
  2. 如果我们的服务架构是由若干微服务组成的,其中一个微服务的异常导致了你的某个API请求异常了,你是否能快速定位到时哪个微服务出了问题?
  3. 在部署系统后,你是否能观察出来系统的性能是上升了还是下降了?

如果我们对这些有不太确认的答案,那么我们就可以来看看,如果借助监控和日志分析工具,第一时间发现线上问题,以及快速定位产品问题。

    什么是日志管理呢?日志就是操作系统和应用软件自动生成的事件说明或者消息记录,包含了时间、日志信息,在日志数量不多的时候,凭借肉眼或者借助文本编辑器,还能大概看出日志的内容,但是当日志数量一多,从日志里查找需要的信息就变得很困难了。

    现在的应用程序越来越复杂了,尤其是像微服务这样的架构,一个系统需要由若干微服务组成,每个微服务可能还会部署在若干容器上,那么意味着如果你要根据日志去排查故障的话,需要从几十、上百个地方去收集日志,再逐个去分析。

    我们想要解决这样的问题,就需要对日志进行统一管理,日志管理就是对系统和应用产生的日志进行处理的方法,包括对日志统一收集、对日志数据进行筛选和解析,统一存储,还要让他们可以方便被检索。

    当然我们不需要自己从头去实现这样的日志管理系统,现在有很多成熟的日志管理工具可以帮助我们,我们只需要去了解这些工具可以帮助我们做什么,以及如何基于他们来搭建适合我们项目的日志管理系统即可。

    那如何快速发现和定位问题呢?

    首先,日志集中式管理后,就可以方便地对所有日志进行统一的检索。当所有日志都放在一起检索时,自然就能高效地定位到问题了,而不是到各个应用程序的日志里去检索。同时,检索方式上,可以用类似于Sql语句的方式来检索,高效地对结果进行查询和归类:

日志管理:快速发现和定位问题

然后,对日志进行集中式管理后,可以通过图表直观的看到应用运行情况。当所有的应用实时将日志传输到一起,日志管理系统就可以根据应用日志中记录的信息,动态生成图表,实时看到应用运行的情况。

日志管理:快速发现和定位问题

最后,可以根据日志的数值设置规则自动报警。对于从日志中实时分析出来的数据结果,如果设置好相应的阈值,在超过阈值后,自动触发报警,通知相关的开发人员进行维护。

我们可以看到,当我们搭建好一整套日志管理系统后,不仅可以帮助我们快速地对日志进行检索,还可以根据图表看数据走势,还可以通过对日志分析结果的监控,设置自动报警的规则,第一时间了解系统故障。

那大厂的日志管理系统的架构是什么样子的呢?现在对于像阿里、新浪这样的大厂来说,对日志管理系统的应用已经是标配了,比如说阿里云的《基于ELK实时日志分析的最佳实践》、新浪的《ELK Stack在新浪微博的最佳实践》、《新浪是如何分析处理32亿条实时日志的?》、七牛的《如何快速搭建智能化的统一日志管理系统》。

    很显然,很多大厂都是基于ELK搭建的自己的日志管理系统,而ELK的架构也是一套经典的日志管理架构,今天我们以ELK为例来说明日志管理系统的基本架构。

    ELK是什么?ELK是Elasticsearch+Logstash+Kibana的缩写,Elasticsearch是一套搜索框架,提供了方便的接口,可以方便地做全文检索,可以用来对日志进行检索。Logstash是一个数据收集工具,可以用来收集日志数据。Kibana是一套可以和Elasticsearch交互的界面,通过Kibana可以方便的检索Elasticsearch内的所有数据,还可以用图形化的方式展示数据结果。

    基于ELK搭建的日志管理系统基本架构如下:

日志管理:快速发现和定位问题

这套架构分为几个重要的模块:日志采集和解析、存储和搜索、结果可视化和监控报警

  1. 日志采集和解析

要想对日志进行统一管理,就必须要从各个应用系统收集日志,Logstash就可以帮助实现对日志的采集,然后解析成结构化的数据,才能方便地检索,logstash不但可以对日志数据进行收集,还能对日志数据进行过滤和解析,解析完成后再将解析好的数据发送给Elasticsearch

  1. 存储和搜索

当所有的日志数据都被集中存储后,可以想象这个日志数据库是相当庞大的,直接查询效率是比较地下的,需要对其进行索引和分析,从而可以快速地检索出来结果。

Elasticsearch就是一套专业的全文检索和数据存储系统,同时还有一套类似于SQL的查询语句,这样我们就可以基于它方便对收集好的日志数据进行检索了。But,Elasticsearch本身类似于数据库,没有图形化界面。

  1. 结果可视化

可视化是日志管理的另一项重要功能,通过可视化的图表,可以直观看到数据走势,方便跟历史数据对比。例如通过观察交易数据的走势曲线,能看出来这周的交易数据比上周是增长还是下降;根据API响应速度的走势,可以看得出新版本部署后,性能是提升还是下降。Kibana就是一套专门针对Elasticsearch的图形化操作工具,可以方便对Elasticsearch数据进行检索,也可以对结果用图表的方式展现

  1. 监控和报警

ELK只提供了基础的日志管理框架,基于它可以有很多扩展,比如自动报警就是一个典型的场景,基于已经存储和索引好的日志数据,制定相应的自动报警规则,当线上服务发生异常时,可以自动地触发报警,通知相关值班人员及时处理。

ELK可以通过插件的方式,安装ElastAlert或Watcher类似的自动报警插件,实现自动报警功能。

日志管理:快速发现和定位问题