我们从实际经验中,总结出了9个能立即上手的日志记录要点|译文

本文总结了9条日志记录最佳实践。是否记录日志不再是问题的现在,如何记录日志和日志记录什么内容,已经成为 IT 运营部门试图提高应用程序性能和投资回报率,需要关注的领域之所在。

是否记录日志不再是问题的现在,如何记录日志和日志记录什么内容,已经成为 IT 运营部门试图提高应用程序性能和投资回报率,需要关注的领域之所在。

本文来自 | Dvir Peretz翻译 | Seanhao


本文收集了一些最佳实践及注意要点,可以帮助您“更明智地记录日志”,并为您在排查问题时节省宝贵的时间和资源。


1、了解你的受众


在处理日志前,首先要了解的是——应用程序日志有两类非常不同的受众:人和机器。


机器擅长快速且自动地处理大量结构化数据,人类在处理大量数据时不如机器,阅读日志很耗费人类的时间。然而,人类能很好地处理非结构化数据。


为了最大限度发挥日志的价值,需要让日志既满足人类可读性的要求,又满足机器结构化的需求。


2、日志标准化


做好日志记录的前提,是给日志文件定义标准的结构,且这个结构在系统所有日志文件中都是一致的。


一行日志代表一个单独事件,需要有时间戳、主机名、服务名称和记录器名称等信息,其附加信息还可以有线程或进程 ID、事件 ID、会话 ID 和用户 ID。


其它重要值可能与环境有关,例如:实例 ID、部署名称(deployment name)、应用程序版本或其它与事件相关的键值对。


使用高精度时间戳(如果没有更精确的,用毫秒精度),确保时间戳格式包含时区数据。除非有更重要理由,否则使用 ISO8601 的标准格式。


最后,真正的专业人士,要在每一行日志添加一个唯一的 ID。每种日志通常都有固定及可变的部分,这使得在输入和输出特定模式的日志时很难对单条日志进行过滤。尽管正则表达式很好用,但唯一 ID 可直接定位到某条日志,其作用明显更大。


当记录错误日志时,请添加一个错误 ID,这在日志管理体系中非常有用。


以上这些,对于关联分析不同组件或整个日志体系中的问题非常重要。


3、了解指标


指标是日志记录的一个核心概念,用来说明总体综合数量特征。


一个指标是某属性在一个特定时间的特定值,通常以规定的时间间隔进行度量。


常见的指标类型有:

- Meter -测量事件的发生率(例如网站的访客率);

- 计时器-测量某些过程消耗的时间(例如 Web 服务器响应时间);

- 计数器-递加或递减一个整数值(例如登录用户数);

- Gauge-测量任意值(比如 CPU 占用率)。


每个指标都描述了系统某些属性的状态。


指标的好处就是有大量的数据,并且不同的指标可以关联到一起。例如,当用户花在网页上的时间增多时,“网上吸猫”的指标增速最快,就可以判断用户更喜欢吸猫而不是做其他的事情。


观测指标时,建议长期跟踪并记录指标变化,或将指标与日志分开存储。


4、告警与排障


如果代码中出现了 bug,并且您已经确定系统中出现故障,也许应该采取应对措施,那么不要“在错误日志上设置 ALERT ”——这通常复杂且容易出错。相反,要直接从代码中触发 ALERT。


此外,当记录异常时,虽然堆栈跟踪很有用,但很难阅读。用 Apache ExceptionUtils 可以概述堆栈跟踪信息,这样更容易使用。


5、按严重程度对日志分级


不同事件具有不同的严重性。这一点很重要,它能让你将严重事件与重要事件、不规则事件与常规事件区分开来。


不要忽略出现概率低的严重事件,在为应用程序行为设置基线时,它们可用作数据点。


你的日志中应该主要包含 Debug、Info 、 Warn 信息,以及很少的 Error 信息。


6、始终提供日志上下文


开发人员根据代码记录日志。这意味着当在代码中记录日志时,是基于代码的上下文的。可是读日志的人没有这些上下文信息,有时甚至没有代码的访问权限。


例如,对比以下两行日志信息:

- “数据库挂了。”

- “获取 ID=1 的用户的首选项失败,配置数据库没有响应,将在 5 分钟后重试。”


阅读第二条日志行,我们很容易理解应用程序试图做什么、什么组件失败,以及是否有解决这个问题的方法。


每一条日志行都应该包含足够的信息,以便于准确理解发生了什么,以及在此期间应用程序的状态。


7、选择一个好的日志框架,并善用它的高级特性


不要花费没必要的时间在搭建自己的日志框架上。每种编程语言都有大量优秀的日志库。呃,也许 TrumpScript 除外。


日志框架允许设置不同的附加器,每个附加器都有其输出格式和自定义日志模式。此外,其他标准功能还包括自动添加记录器名称、时间戳、支持多个严重性级别和按这些级别筛选。


日志框架还具有以下要用到的高级特性:

- 为代码中的不同组件配置不同的日志级别阈值;

- 使用丢弃附加器,队列满时可以将低级别事件丢弃在这里;

- 使用日志综述附加器,可以记录:“消息重复 X 遍:【消息正文】”,而不是真的将此条日志消息重复记录 X 遍;

- 在日志级别上设置一个阈值,并将其配置为,在发生更高严重性的日志时也输出 N 条较低级别的日志。


8、写入结构化的日志(根据情况)


让您的附加器编写结构化日志可能会对性能造成一些影响,但如果能这么做,这将是很有价值的。


日后,将自研工具加载到日志分析工具中,或使用日志代理处理日志,将会更容易实现。


9、虽然记录了很多,但应该记录更多


我们经常忽略重要的日志,或者有意不写日志以确保日志的简洁。通常,在日志中找不到答案的话,您将需要浪费更多的时间弄清系统做了什么,然后还要花费大量时间对其进行梳理。可以说,日志的质量,是代码质量或系统质量的一部分。


总之,使用集中日志记录方案,自动化日志处理系统,并应用上述的各种技术保持日志的有用性,坚持记录日志吧。


欢迎各位提出不同的意见,以持续改进这个列表。


原文地址:https://medium.com/@dvir.peretz/9-logging-best-practices-based-on-hands-on-experience-b6412c8faac3

  • 发表于 2019-03-29 19:03
  • 阅读 ( 603 )
  • 分类:其它类型

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
admin

10 篇文章

作家榜 »

  1. 日志易 24 文章
  2. admin 10 文章
  3. 出黑啊林 2 文章
  4. 出款啊林 2 文章
  5. 王进林 2 文章
  6. 日志易小A 2 文章
  7. 小小怪 1 文章
  8. 节奏才是王道 1 文章