微信号:greatops

介绍:高效运维公众号由萧田国及朋友们维护,经常发布各种广为传播的优秀原创技术文章,关注运维转型,陪伴您的运维职业生涯,一起愉快滴发展.

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

2019-03-15 07:10 Ardusty

作者 | Dvir Peretz
译者 | Seanhao

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

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

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 的用户的首选项失败,配置数据库没有响应,将在 分钟后重试。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


译者注:日志记录的规范性决定了日志分析的质量和效率。日志易通过与大量行业客户的沟通,以及长期的项目实践,逐渐形成了成熟的日志管理规范。其中日志记录实践及建议多达近百项,涵盖服务器日志(虚拟机、Docker 等)、网络与安全产品日志、中间件及数据库日志、应用系统日志、终端设备日志等五大类日志来源。


技术提升无止境~阅读完本文你是否想跃跃欲试了呢?

别激动,我们还为您准备了一次下线技术分享盛宴。

3 月 20 日,由日志易、数澜科技、云问科技联合主办的 CIO 公开课之《企业大数据能力建设与最佳实践分享》,日志易技术专家将会为您带来更多精彩内容及案例应用!识别二维码即可了解详情。

地点:北京海淀西街70号3W咖啡

 
高效运维 更多文章 值得收藏:一份非常完整的 MySQL 规范指南 何所思:为什么说,技术的路上,弯道超车总是一个笑话? 在故障面前,除了背锅,运维还能做些什么? 阿里员工排查问题的工具清单,总有一款适合你! 听说,整个运维行业可能被干掉
猜您喜欢 Docker浅析——如何从Vagrant转向Docker 想在未来,做在当前 【QingCloud Insight 2016 演讲实录】刘奇:How do we build TiDB 活动 | 本周末微软在Beijing Mini Maker Faire,约吗? 为什么redis内存不宜过大