在分布式系统中进行日志查询与管理的新手段介绍

原文链接

日志查看方式

随着技术的发展,越来越多的系统从单机转向到分布式,同时对应的日志查看方式除了直接查看文件外,也发展出了各种集中日志管理方式。其中常见日志查看方式如下:

单线程程序

开发单机程序时诊断非常简单:设置断点,检查断点上下变量状态即可。
当程序部署线上后,可以把断点中内容以日志方式记录下来。出现错误后,还原日志上下文(Context)不难,只要把日志文件中前后N行拿到后都能容易找到问题

DingTalk20170609201400.png

多线程程序

当多线程出现后,还原上下文变得复杂一些,因为不同线程打日志顺序会造成一定干扰。我们可以在日志中记录、筛选线程(ThreadID)来排除其他线程干扰,拿到上下文

DingTalk20170609201456.png

分布式系统

在分布式场景下(比如Docker、LXC、多服务器等),进程会同时跑在不同服务器上,一般通过集中式日志管理(例如Splunk、ELK、日志服务)等查找定位日志。

DingTalk20170609201628.png

这种场景下查找日志非常方便(例如通过"Level:Error","Latency>100000 & Method:HandleRequest"等能对上亿日志进行快速查找),但定位到关键日志后还原上下文却变得很难。因为日志采集、索引都是无序的,为了还原上下文,必须通过时间、机器、线程号来筛选和查找(这种方法一般不够精确),业界并没有好的方法。

日志上下文查看

今天日志服务(原SLS)LogSearch在查询分析基础上,提供了查看上下文的按钮,既可以在控制台上 完全精确 还原任意日志上下文(上下N条日志),并支持对指定内容(比如ThreadId)进行筛选,帮助你快速定位问题。整个过程如图所示:

DingTalk20170609202622.png

使用依赖

  • 只支持使用Logtail客户端收集的日志
  • 指定日志库(Logstore)必须开启索引功能

实际场景

  • Dev在线上通过关键词查询,定位到一个异常日志

DingTalk20170612104019.png

  • 点击上下文查询后,既跳转到前后N条上下文显示框
    • 可以通过“更早”、“更新”等按钮加载更多上下文,也可以点击“返回普通搜索模式”进一步排查
    • 通过筛选框筛选ThreadID,进行精准上下文的过滤

DingTalk20170609203658.png

原文链接

原文地址:https://www.cnblogs.com/iyulang/p/7000646.html