是否记录日志不再是问题的现在,如何记录日志和日志记录什么内容,已经成为 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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!