标签归档:日志

研发效率提升的秘诀:日志管理的系统化策略

你是否也遇到过线上出问题了,查找日志,发现都是 ERROR 日志?

你是否也遇到过虽然有日志,但是日志实在太多,在茫茫日志中无法有效地定位到问题?

你是否遇到过要去排查前人写的代码产生的 BUG,却还需要把先把相关的代码过一遍,找到相关日志点,再去搜索日志?

你是否遇到过日志越来越多,不同的人都在打,有些日志没有用了,还是在不停的打?

你是否遇到过奇怪类型的日志,甚至相互冲突以至于无法定位问题?

你是否遇到过因为打个日志,导致客户端崩溃?

……

当日志不在大家的视野中,凭着个人的喜好去打,去定位问题,最终整个日志就会变成一个不断膨胀的怪物,变成大家使用起来都感到困扰和无助的混乱池塘。

当日志的生成和使用没有统一的规范和标准,每个人都按照自己的方式和喜好来记录和查找日志,日志的内容和格式就会变得五花八门,导致理解和分析日志的难度大大增加。另外,无效的、重复的、甚至是错误的日志会像野草一样无序地生长,使得日志的数量越来越大,而有效的、有用的日志则可能会被淹没在这个日志的海洋之中。

此时,我们需要建立一套有效的日志管理策略,包括设定清晰的日志记录标准,实施有效的日志标准管理,优化日志存储和清理策略等。只有这样,我们才能把这个日志怪物驯化,使得日志成为我们解决问题的有力工具,而不是一种困扰。

从过往的经历和上面描述的这些问题里面我们洞察了如下的问题点:

  1. 日志规范管理的问题
  2. 日志无序增长的问题
  3. 日志劣化和无人维护的问题
  4. 日志导致的线上问题

那么我们如何有效的去解决这些问题呢?

大概有如下六个步骤:制定标准、系统化实现标准管理、实现统一的日志 SDK 接入、使用统一的日志管理系统、定期复盘标准并落地日志的生命周期管理。具体如下:

  1. 制定标准:日志的标准应包括但不限于如下几个方面:

    • 日志级别:定义不同级别的日志,如 DEBUG、INFO、WARN、ERROR 等,以便于过滤和查找。
    • 日志格式:定义统一的日志格式,包括时间戳、日志级别、日志来源、日志内容、错误堆栈等信息。
    • 日志内容:明确记录哪些信息,如请求信息、业务数据、错误信息等。避免记录敏感信息,如用户密码、身份证号等。
    • 日志保留时间:根据日志的重要性和存储成本,设定不同级别日志的保留时间。
    • 是否废弃:类似于接口的 Deprecated 注解,废弃的接口在定时间内会停止上报,并无法查询。
  2. 系统化实现标准管理:以系统的方式将标准、SDK 下载管理起来,并且和集成的日志系统关联上,主要包括以下三点:

    • 标准管理:实现日志标准的管理和维护,包括日志的级别、字段、格式等。此外,也应当支持标记废弃等生命周期相关的字段,以确保所有人员都能了解到哪些标准不再使用。
    • SDK 下载:提供一个 SDK 的下载功能,允许开发同学根据需要下载适合特定平台或语言的日志 SDK。这种 SDK 应当已经集成了日志标准,以确保开发者在使用 SDK 时能够自动地遵循标准并上报到统一的日志平台。
    • 日志系统跳转:和真正的日志系统(如 ELK)打通。如提供一个默认的跳转链接,可以直接跳转到 ELK 的对应界面,查看满足这些参数的日志。
  3. 实现统一的日志 SDK 接入:提供一个统一的日志 SDK,用于记录和上报日志。这样可以简化开发同学的工作,只需要调用 SDK 提供的接口,就可以按照标准记录日志。而且,SDK 可以处理一些公共的日志任务,如添加时间戳、格式化日志、处理错误堆栈、防止打日志时崩溃等。SDK 应该是跨平台、跨语言的。

  4. 使用统一的日志管理系统:使用一个专门的日志管理系统,来收集、存储、查询和分析日志。这样可以提供一致的日志服务,提高日志的可用性和可维护性。例如,可以使用 ELK(包括 Elasticsearch、Logstash、Kibana)作为日志管理系统。

  5. 定期复盘标准:随着业务和技术的发展,可能需要更新日志标准。因此,需要定期复盘标准,看是否需要改进。定期复盘标准的频率可能会因为具体情况而变化。如果业务和技术环境比较稳定,那么可能每年复盘一次就足够了。如果环境变化比较快,那么可能需要每季度甚至每月复盘一次。

  6. 日志的废弃管理:日志的生命周期管理包括日志的生成、收集、存储、查询、分析和废弃等步骤。其中,废弃管理是一项非常重要的任务,因为它直接关系到日志系统的健康和效率。日志的废弃管理可能包括以下几个方面:

    • 过期删除:设置日志的保留期限,过期的日志将被自动删除。这个期限可能会根据日志的级别和重要性而变化。比如,ERROR 级别的日志可能需要保留一个月,而 DEBUG 级别的日志只需要保留 3 天。
    • 空间限制:设置日志的存储空间限制,当存储空间达到一定的阈值时,最旧的日志将被自动删除,以释放空间。
    • 废弃标识:为废弃的日志添加标识,这样在查询和分析日志时可以忽略这些日志。同时,废弃的日志应当尽快被删除,以节省存储空间。
    • 废弃通知:当一个日志标准被废弃时,需要通知所有相关的人员,以避免他们继续使用这个标准。同时,也需要更新日志 SDK 和管理系统,使它们不再支持这个废弃的标准。

回顾一下,我们制定了一套清晰的日志标准,随后通过系统化的管理方式实施和维护这些标准。借助统一的日志 SDK 和日志管理系统,我们可以提升日志生成和使用的效率。这样,日志便从混乱的信息池转化为强大的问题解决工具,从而提升整体的研发效率