日志就是记录,是服务器运行时输出的记录。日志包括各种等级,比如错误(error)日志、警告(warn)日志、提醒(info)日志、调试(debug)日志等。我们在服务器输出日志时可以选择将日志输出为某个等级。
对于大规模的企业级的应用,日志绝对是一个必不可少的功能,对于问题排查和应用调试和监控等,都是十分重要的。
但是对于一个满足亿级访问需求的大规模企业级的系统,仅仅是将运行时的输出的日志保存下来是远远不够的,因此,从开发者的角度来讲,我们实现了全息日志。
全息日志的目的是为了方便开发者实时查看log,加快问题定位的效率。
全息日志查看方式如下:
(图1:全息日志截图)
通过全息日志,我们可以很方便的实时的查看用户的访问nodejs时服务器的实时log。简直是定位问题的神器。
全息日志的实现细节:
用户访问我们的服务的时候,我们会通过nodejs的console模块去打日志,我们可以通过hack该模块,把用户的输出log都劫持了然后暂存起来。
等到请求结束,我们可以监听nodejs的http.ServerResponse对象的finish事件,把当前用户请求所关联的完整的日志,发送到缓存服务器(为了实时,一般可以考虑redis或者cmem)保存起来。
我们通过一个key将日志保存在缓存服务器,这样我们就可以通过该key,将日志内容都提取出来,并且通过友好的格式化的输出来,这就是我们的全息日志了。(参考图1)
全息抓包了解一下:
现实中抓包的软件中比较著名的有几个:Fiddler、wireshark、Whistle等。
以Fiddler为例,他是一个http的抓包工具,只要是经过他代理的http请求,都能在该软件上查看请求和响应的详情,还可以设置请求的修改、重放、断点,响应的断点,文件的本地代理等强大的功能。我们还可以批量保存Fiddler的http会话(请求和响应包),方便下次查看并进行调试和问题的排查等,Fiddler的软件界面如下:
Fiddler保存会话的文件为SAZ文件,SAZ是Session Archive Zip的缩写,参考官网的描述:http://fiddler.wikidot.com/saz-files。可以简单的理解就是把http请求报文和http响应报文保存成文件夹和文件的格式(http请求和响应报文的格式可以具体借助搜索引擎复习下),并打包为一个文件,Fiddler只要读取改SAZ文件就知道http会话的详细内容。
对于其他的HTTP抓包工具,原理也是一样的,其核心就是供抓包工具使用的打包文件,里面按照一定的格式保存了http请求报文和http响应报文,即http会话。
回到全息抓包,我们定义的全息抓包为:当前用户的http会话+服务器跟后端服务器的http会话(不一定是http协议,但是本文只讨论http的)。
我们先来看下现代的web服务的架构:
我们的web服务器一般部署作为FRONTEND SERVER,对用户提供统一的web服务能力,而后台系统一般作为BACKEND SERVER,对web服务器提供数据能力,这样的好处是前后端分离,前端开发可以专注在FRONTEND SERVER,后端开发专注在BACKEND SERVER。
那么我们定义的全息抓包,就包括了用户和FRONTEND SERVER之间http会话、FRONTEND SERVER和BACKEND SERVER之间的http会话,可以说是360度无死角的抓包,我们使用的云抓包查看系统:https://qzone.tswjs.org/log/view/html/xxx,xxx需替换为你配置到环境中的key,如下所示:
如何实现全息抓包:
上面提到,整条调用链路涉及的HTTP会话分为两种:
1.用户和FRONTEND SERVER之间之间http会话。
2.FRONTEND SERVER和BACKEND SERVER之间的的http会话。
所有的http会话,都会有一个request对象和response对象。我们都可以从request对象中提取出http请求的报文,从response中提取出http响应的报文。拿到报文,我们就可以将它们格式化成抓包工具所需要的文件格式,利用抓包工具强大的能力进行应用的调试和问题的定位。
(欲知细节,建议阅读TSW源码)
利用全息日志+全息抓包还原用户现场:
有了全息日志+全息抓包,我们就有了完整的用户现场。
有了FRONTEND SERVER运行时的日志,我们就掌握了web服务器运行时的状况。
有了用户和FRONTEND SERVER之间http会话和FRONTEND SERVER和BACKEND SERVER之间的http会话,我们可以发现用户响应是否正常;
确认是不是后台请求回包出现问题了。
(终于,妈妈再也不用担心我背锅了)