基于日志的故障诊断
日志是故障诊断的重要手段,可以记录程序运行时的动态信息,帮助维护人员分析重现 错误,进而更正系统错误,提高系统运行的可靠性。但通过日志进行故障诊断并非易事。随着时间的积累,日志越来越庞大,用户常常无法快速地定位问题日志。而且单台机器的空间 有限,每隔一段时间就会删除日志文件,这对于问题的追溯也造成了困难。
尤其对于分布式系统来说,日志分散在系统各个节点上,更增加了日志的查看和错误 发现难度,用户登录几十或上百台机器查看日志是个极大的负担。另外对于多个服务组成 的系统(比如微服务系统)来说,各服务之间的调用关系链也难以跟踪,出现一个错误时 要彻查根源非常困难。
本节将对利用日志进行故障诊断的现状和常用方法进行综述,并介绍网易云平台中改 进的解决方案,结合网易云平台和日志服务的实际例子进行说明,以便读者理解和使用。
日志诊断现状
对于单机系统来说,目前业内采用最普遍的仍然是 tail -f + grep/awk 的方法。或者手动 将日志文件从服务器拉取到本地之后再利用工具搜索查看,这些方法简单粗暴,也存在很 多问题,比如日志文件过大、难以查找、效率低、权限无法控制等。
大家已逐渐发现上述方法不方便,由此兴起了很多分布式的日志集中管理系统,比如 Splunk、ELK 等。这些系统解决了分布式登录、权限管理、难以查找定位等问题,极大地 方便了日志的维护,但对于其系统本身的维护和应用又存在一定的困难。
网易云基础服务是以分布式微服务为基础的平台,研发团队很早就意识到日志对系统
维护的关键作用,并在最早的版本中提供了日志服务,包括日志实时跟踪、日志搜索定位、 按时间定位、request_id 关联、日志搜索结果上下文查看等功能。下面以网易云基础服务平 台的实际案例来演示如何进行便捷的分布式系统错误日志定位。
实时跟踪
小王的系统已经部署在网易云云基础服务平台,他首先想知道目前系统运行状态是否 正常,需要看实时的日志输出。小王的系统是由多个容器组成的微服务系统,他需要逐个 登录不同的容器去进行日志查看吗?当然不用,因为日志服务已经默默地在后端做好了一 切。小王只需要打开日志服务页面,选择好相应的服务名称,相关的日志就会实时输出到 页面中,如图 4-32 所示。
小王观察了一会日志,发现一切正常,基本上就放心了。但由于日志比较多,页面 刷新得比较快,有些细节无法查看清楚,是否可以只根据某些关键词过滤输出呢?
查找定位
小王想要根据关键词过滤实时输出,在日志服务中,这其实也非常简单。只要将相关 的关键词输入到搜索框就可以(支持标准 Lucene 搜索语法)。在搜索过程中,包含关键词 的日志会实时刷新出来。如果想要查看之前包含关键词的日志,只要鼠标往上滚动即可, 如图 4-33 所示。
搜索结果上下文查看
小王用一个关键词搜索了日志之后,所有相关的日志都列出来了。可是小王想要查看 错误的具体原因,还需要错误日志的上下文,仅仅显示错误日志内容是不够的。日志服务 能解决该问题吗?答案也是肯定的,日志服务独创地开发了上下文查看功能,小王要查看 前后因果日志,只要在错误日志上点击,日志服务就会弹出日志上下文的查看窗口,如图 4-34 所示。鼠标上下滚动,还可以查看无限内容的日志。
按时间定位
系统已经跑了一段时间了。有一天晚上,系统偶尔出现了点异常。第二天,小王想要 查看当时那个点的日志,需要从最新的日志开始一直往后翻吗?不用。日志服务提供的按 时间定位日志功能,如图 4-35 所示,只要输入具体的时间点,就能准确定位到时间点附近 的日志,方便定位查找,而且系统马上就返回结果,小王可以快速查看问题具体原因。
系统里有很多个模块,也跑很多线程。一个用户的请求,需要很多的处理流程,可系 统打出来的日志是杂乱无章的,并不能保证每个事件点之间的顺序。这让小王在追溯整个 事件时很受伤。自从小王给每个请求都加上了 request_id 之后,整个问题就解决了,借助 日志服务的搜索查看及日志统一管理功能,小王只要输入 request_id,就可以清晰地看到整 个事件的处理流程,如图 4-36 所示。
就这样,通过使用网易云基础服务中日志服务的主要功能,小王很好地克服了分布式 系统的日志故障诊断难题,此外日志服务还支持用户自定义订阅模式,可实现支持日志监 控、报警、日志加工等服务。
文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著
参考文档:https://sq.163yun.com/blog/article/221368597375414272