杭州电子科技大学 计算机学院
摘要:研发人员遇到系统业务问题时,使用传统的日志框架越来越难以定位和追踪。本文首先对日志系统的研究背景进行分析,然后分析了系统的具体需求,并对系统功能模块进行了划分和设计。基于流量特征实现了系统问题实时精确分析平台,操作简单、结果直观,给研发人员提供一种全新的排查问题的方法。
关键词:日志系统;动态配置;精确分析
1研究背景
日志可以用于用户的行为信息分析,发现潜在商机;日志可以帮助开发人员找到 bug 的来源,修复漏洞。伴随着近些年来互联网上用户量的飞速增长,互联网上提供服务的服务器数量也与日俱增,随之产生了越来越多的日志数据。日志系统用于收集程序运行过程中的各种行为和状态信息,是分析系统业务问题的核心工具。ELK 是由 Elasticsearch、Logstash、Kibana 组成的开源日志处理平台解决方案。在面对大流量、长链路的应用时,ELK仍然有很多不方便的地方:浪费系统性能,无法实时开启、关闭日志收集;无法将一次请求链路的日志完整的串联起来,存在无关请求干扰;日志没有结构,可视化不够清晰。
2系统需求分析
本系统面向的用户主要是开发人员和测试人员。从开发人员的角度分析,对系统的主要需求包括根据资源id和用户id进行流量识别动态决定是否开启日志收集、日志分级打印、兼容主流的日志框架、信息预处理、日志持久化等;而测试人员的基本需求则是对规则配置进行统一的维护、日志可视化、用户认证授权等。
根据上述基本需求分析,本系统在设计与实现上应该具备如下基本的功能操作:基于资源id和用户id进行流量识别动态决定是否收集日志;日志分级打印;兼容主流的日志框架;对日志参数和日志整体进行预处理;将日志详情和日志基本信息持久化;对规则配置进行统一的维护;日志基本信息和日志详情的可视化;对不同用户的权限进行管理。
3系统总体设计
3.1系统特征
本平台的根本目的是提供一个便捷的工具,帮助研发人员迅速定位系统问题所在,使原本黑盒状态的应用逻辑处理与数据变化变得清晰明朗。其特征主要包括以下几点:
(1)精确的流量识别:通过事先在关键节点日志埋点,基于资源id、用户id进行实时的判断,能够达到某个资源、某个用户维度的精确分析。
(2)实时开启与关闭:通过分布式协调服务提供者Zookeeper维护核心配置元数据,用户通过简单配置即可实现日志打印的实时开启与关闭。
(3)排除无关请求的干扰:通过Java ThreadLocal技术将一次请求的一条链路的日志完整的串联起来,独立收集并保存。
(4)日志结构化、可视化:使用Spring Boot和Vue.js搭建前后端分离的系统,将经过预处理后的结构化数据进行直观的可视化渲染。
3.2与Spring Boot的整合
虽然本系统提供的jar包中大部分的bean是由自己管理的,向业务方屏蔽了具体依赖对象的创建过程,业务方只需要手动创建一个启动bean或者将这个启动bean交给Spring管理即可。但是为了让业务方接入能够更加简单和无感知,本系统也提供了一个Spring Boot Starter,实现了自动配置。
3.3系统功能模块划分
(1)链路日志收集模块
基于平台配置的规则,加上系统链路入口处埋点,判断当前请求是否需要开启日志收集。一般会基于资源id、用户id去匹配流量特征,匹配到流量时才进行实际的日志记录。不匹配的情况下,日志不会被收集,所有日志记录代码不会执行。
(2)信息预处理模块
类似于传统的日志框架,本系统支持任意类型、任意个数的日志参数,这是在日志参数预处理阶段完成的。日志收集过程中,JVM堆中的日志详情真正存储到物理磁盘之前,会被转换为约定的标准格式,以便于后续进行可视化渲染,这是在日志整体预处理阶段完成的。
(3)日志持久化模块
日志并不会输出到传统意义上的日志文件中,而是一次请求对应一个文件,独立保存。匹配到的流量,链路执行完成时,会将此次请求的整个链路上的日志详情作为一个单独文件异步存储到磁盘上。日志的基本信息会被发送至消息队列,最终存储至Elasticsearch,用于控制台实时查询匹配到的流量。
(4)规则配置维护模块
规则配置元数据存储在分布式协调服务中,其主要的属性有:应用名、资源id、用户id、开关状态、全局唯一键、开启时间、清屏时间、创建人、创建时间等。
(5)日志可视化模块
日志基本信息数据来源于Elasticsearch,例如资源id、用户id、请求时间、服务器IP、各个级别的日志条数、响应时间等。向用户展示匹配到的请求列表,即开即用。日志详情数据来源于业务方自己的服务器磁盘,不同的日志级别通过不同的样式加以区分,一条日志中的日志消息和日志参数也通过不同的样式加以区分,以突出关键信息;对象类型的参数会经过JSON美化后展示,两个对象参数可以进行
JSON比对。
(6)认证授权模块
主要包括注册与登录功能、用户信息的修改、删除用户、权限管理功能等。
3.4兼容主流日志框架
尽管本系统具备传统的日志框架的主要功能,但是其侧重点与传统的日志框架有本质区别;并且,为了复用实际已经存在的项目中的日志打印代码,同时减少对业务代码的入侵,本系统实现了一个日志追加器,只需简单配置即可将原有日志输出职责委托给本系统。这样的日志追加器让传统的日志系统也具有了本系统的优良特性。
4. 结束语
本次研究从日常开发场景中遇到的痛点出发,针对传统日志框架存在的问题提出了具体的改进方案,实现了以下目标:根据当前请求特征,动态确定是否收集日志,支持实时开启、关闭;精确打印一次请求链路的日志并独立保存,不存在无关请求的日志干扰;统一在系统后台查看日志,操作简单,对结构化的日志进行直观的可视化,从而将能够帮助测试人员进行更完善的测试,帮助开发人员快速定位追踪线上问题。随着应用流量越来越大,业务链路越来越长,本平台发挥的作用将会越来越明显。
参考文献
[1]翟雅荣, 于金刚. 基于Filebeat自动收集Kubernetes日志的分析系统[J]. 计算机系统应用, 2018, 27(09): 81-86. DOI: 10. 15888/j.cnki.csa.006528.
[2]王裕辰. 基于ELK Stack的实时日志分析系统的设计与实现[D]. 北京邮电大学, 2018: 12-20.
[3]张彩云, 牛永红, 赵迦琪. ELK日志分析平台在系统运维中的应用[J]. 电子技术与软件工程, 2017(06): 182-183.
[4]鲜征征, 叶嘉祥. 一种改进的ELK日志采集与分析系统[J]. 软件导刊, 2019, 18(08): 105-110.
[5]周映, 韩晓霞. ELK日志分析平台在电子商务系统监控服务中的应用[J]. 信息技术与标准化, 2016(07): 67-70.
[6]李祥池. 基于ELK和Spark Streaming的日志分析系统设计与实现[J]. 电子科学技术, 2015, 02(06): 674-678.