本文通过查询、关联分析、统计分析等场景介绍如何使用日志服务对程序日志进行查询和分析。
背景信息
程序日志内容全、存在一定共性,它是运维程序的重要信息,但程序日志具有如下不便于存储与分析的特性:
格式随意:不同开发者的代码风格不同,对应的日志风格也不同,难以统一。
数据量大:程序日志一般比访问日志大1个数量级。
分布的服务器多:大部分应用为无状态模式,运行在不同框架中,例如云服务器、容器服务等,对应的实例数从几个到数千个,需要有一种跨服务器的日志采集方案。
运行环境复杂:程序运行在不同的环境中,产生的日志也保存在不同的环境中,例如应用相关的日志在容器中、API相关日志在FunctionCompute中、旧系统日志在本地IDC中、移动端相关日志在用户处、网页端日志在浏览器中等。
为了能够获得全量日志,必须把所有日志统一存储。针对该场景,日志服务提供多样化的日志采集方式及一站式分析功能,您可通过查询+SQL92语法对日志进行实时分析,并以图表形式直观展示分析结果。和开源方案对比,日志服务提供的解决方案在查询分析成本上仅是开源方案的25%。
查询程序日志
例如某App出现订单错误或请求延时等问题,您可以通过查询语句在TB级数据量的日志中快速(1s内)定位问题。还可以根据业务需求,设置时间范围、查询关键字等信息,更精准地返回查询结果。
查询延时大于1s,并且请求方法是以Post开头的请求数据。
Latency > 1000000 and Method=Post*查找包含error关键词但不包含merge关键词的日志。
error not merge
关联分析程序日志
关联分析包括进程内关联与跨进程关联,区别如下:
进程内关联:一般比较简单,因为同一个进程前后日志都在一个文件中。在多线程环境中,只需根据线程ID进行过滤即可。
跨进程关联:跨进程的请求一般没有明确线索,一般通过RPC中传入的TracerId来进行关联。
进程内关联
通过上下文查询查看关联日志。例如通过关键词查询定位到一个异常日志,然后单击上下文浏览,查看该日志前后N条日志,操作步骤请参见上下文查询。在日志服务的原始日志页签中,选择原始显示模式,单击目标日志条目左侧的上下文浏览图标(放大镜图标),即可查看该条日志的上下文信息,实现进程内关联分析。
上下文查询结果:在上下文浏览页面中,当前日志(位置 0)以高亮显示,上下文范围为前后各 3 条日志(-3 到 +3)。页面还提供高亮显示和过滤条件输入框,便于快速定位关键信息。
跨进程关联
跨进程关联也叫Tracing,比较常见的工具有鹰眼、Dapper、StackDriver Trace、Zipkin、Appdash、X-ray等。
此处基于日志服务,实现基本的Tracing功能。您可以在各模块日志中输出Request_id、OrderId等可以关联的标识字段,通过在不同的日志库中查找,获取所有相关日志。在日志服务(SLS)查询界面的搜索栏中输入
request_id值595F9A92D30E8E444FC971F4进行查询,时间范围设为 15分钟(相对),共找到 15 条关联日志,查询状态为结果精确。展开第一条日志详情,可见该请求对应的 Nginx 访问日志状态码为status:404,日志时间为22/Oct/2020:11:08:52,来源 IP 为172.16.64.165,日志文件路径为/root/testnginx/acce...1.log。通过request_id可实现跨进程的日志关联分析,快速定位问题请求的完整链路。例如通过SDK查询前端机、后端机、支付系统、订单系统等日志。获得结果后,制作一个前端页面将跨进程分析关联起来。在Tracing系统中,选择具体的Trace ID后,可查看完整的调用链树形结构,包括各方法的调用层级与耗时。例如,
ServerBase::HandleRequest下的KVEngine::QueryInterval耗时61935us,占总耗时的98.99%,为主要性能瓶颈;YouchaoFile::CreateBlock耗时19603us,占31.32%。通过调用链分析,可快速定位跨进程请求中的性能瓶颈方法。
统计分析程序日志
查询到日志后,您还可以做进一步统计分析。
执行如下查询分析语句,统计所有错误发生的类型和位置的分布。
__level__:error | select __file__, __line__, count(*) as c group by __file__, __line__ order by c desc