1、目的
日志,作为系统运行的忠实记录者,不仅是问题追踪的利器,更是性能调优的指南针。通过深入分析日志,我们可以洞悉系统的每一个细节,从而快速定位问题、优化性能。同时,日志也可以作为数据分析和决策的重要依据。研发流程中,如何使用好日志,还是存在如下难点:
① 为了排查问题,我们通常需要记录大量的日志,如何关联客户端当次请求的所有日志,确保信息的完整性和连贯性。
② 日志记录对象过大可能导致频繁GC(垃圾回收),进而造成服务器不稳定。
③核心日志的发送已经实现异步处理,但过多的发送仍会占用CPU 、内存等资源。大量的冗余日志也会浪费宝贵的存储资源。
④一些核心的日志丢失会给排查文件带来极大的困难。
2、分析
分布式系统日志的整合与串联
① 唯一标识生成: 在每个业务任务请求开始时,生成一个全局唯一的标识,这个标识将贯穿整个请求的生命周一,用于标识和串联与该请求相关的所有日志记录。
② 标识传递: 在分布式系统中,请求会经过多个系统或者组件,为了确保日志的准确串联,这个唯一标识需要在请求传递过程中被正确携带。
我们通过在请求出口中生成全局traceID,并存放在线程安全的context 中,每个组件、线程中,当记录日志,从线程'context‘ 中获取'traceId' ,并将其作为日志记录的一部分。通过这种方式,我们实现了服务内的日志串联。
在调用下一级服务时,将当次请求的'traceId' 作为自定义头的一部分添加到请求头中,这样,下一级服务或组件就能够从请求头中提取'traceId',并将其存放自己的线程'context' 中,通过这种方式,我们实现了系统间日志的关联。
前后端日志信息的整合与贯通方案
前后端日志串联打通方案主要涉及前端和后端产生的日志能够按照特定的规则进行关联和整合,以便能够追踪和分析用户操作的生命周期。
① 生成唯一标识: 在请求的入口点(如 API 网关或 负载均衡器) ,为每个请求生成一个全局唯一的标识,如 'traceId'. 这种标识作为用户上一次操作的traceId 将用于串联前后端的日志记录。
② 传递'traceId' 到前端:当后端响应的前端请求的时候,将生成到traceId 包含在响应头中返回给前端,前端接收到响应后,提取traceId, 并将其存储在合适位置。
③ 前端回传'traceId': 前端在发起下一次请求的时候,将存储的traceId 作为请求的一部分传递给服务端,这样,每次请求就可以与上一次请求实现串联。
统一标准日志关联与模块化解决方案
统一日志格式:
定义一套标准的日志字段,包括但不限于时间戳、traceId 、日志级别、日志来源、请求信息(如请求方法 、URL 、参数等) 、响应信息(如状态码、返回数据等)、异常堆栈等,确保所有系统和组件产生的日志都包含这些标准的字段,以便于日志的聚合和查询。
统一的接入方式
制定日志接入的统一规范,包括日志的收集、传输、存储等流程,明确日志数据等数据格式(如JSON 、XML等)、传输方式等。
日志分析工具
开发日志分析工具,对收集到的日志数据进行加工处理,统计分析、可视化展示和异常监测等功能。
安全与性能优化
对敏感数据进行加密处理,确保存储过程中的机密性,对日志数据进行压缩,减少存储空间的占用和网络传输的开销。
3、拓展
组件化:
通过组件化,我们可以为系统提供零入侵的接入方案,这意味着在接入日志治理系统时,无需对原有的系统进行任何修改或者侵入,只需要将日志组件集成到系统中即可,这种零入侵的方式不仅保证了原有系统的稳定性和安全性
配置化:
通过对关键流程接口进行扩展化处理,我们可以实现组件的灵活配置和定制,用户可以根据实际需求,对日志组件进行个性化的配置,以满足不同的业务场景和需求。
抽样化:
核心日志往往包含了大量的关键信息,但其数量也非常庞大,如果全部存储,将带来巨大的存储成本,抽样化技术可以解决这个维内托,对核心日志进行抽样输出,我们可以只保留部分具有代表性的日志数据,从而大大降低存储成本。
降低资源消耗
通过自定义序列化方式,我们可以优化日志数据的传输方式,减少数据传输量,其次,采用日志批量发送的方式,可以将多条日志合并一次发送,减少发送次数和网络开销。