10个日志记录最佳实践

最好的 DevOps 和 SRE 团队已经改变了监控和记录系统的方法。无论系统的复杂性如何,这些团队都能以连贯和合理的方式调试问题。那些无法解释警报、系统故障和其他未知因素原因的大量日志的日子已经一去不复返了。 

实施日志记录最佳实践是维护当今复杂 IT 环境中系统完整性和性能的基础。有效的日志记录不仅通过提供对错误和系统行为的清晰洞察来简化故障排除,而且还通过识别瓶颈和异常来增强性能监控。强大的日志记录对于安全性也至关重要,有助于检测和调查潜在威胁或未经授权的访问。 

遵循此日志记录最佳实践清单将使您的日志记录高效、可操作且可扩展。 

为什么记录很重要?
日志记录了应用程序或底层基础设施系统在运行过程中生成的事件、操作和消息。日志消息包含大量有关系统的有用信息,包括所发生事件的描述、相关时间戳、与事件相关的严重性级别类型以及其他相关元数据。日志对于调试问题、诊断错误和审核系统活动非常有用。它们提供了系统事件的文本叙述,使人们更容易理解所采取的操作顺序。

10 个日志记录最佳实践
1. 构建日志
非结构化日志可能难以解析、搜索和分析。使用结构化日志(例如 JSON 或 XML)以编程方式处理日志,将其与其他日志关联,并将其用于监控和分析工具。结构化日志更易读且更具可操作性,使开发人员和运营团队能够快速识别关键信息。

示例:log.json 文件

{
  “时间戳”:“2024-09-18T12:00:00Z” , 
  “级别”:“INFO” , 
  "message": "用户登录成功"
 
"用户 ID""123456" , 
  “session_id”:“abcde12345” 
}

通过这种做法,您可以尽可能  开始将日志视为结构化事件。

2. 在创建时整合日志
将多个相关日志条目整合为一个连贯的事件可以减少日志量、提高清晰度并简化日志分析。与其单独记录流程的每个步骤,不如将相关详细信息(例如操作状态、时间戳和任何其他关键详细信息)汇总到一个结构化的日志中。 

例如,如果您正在处理用户登录,则可以在一个日志中包含是否验证了凭据、该过程花费的时间以及结果。 

多个日志条目:

"time": "2024-09-18T12:00:00Z" , "level": "INFO" , "message": "用户认证已开始" , "user_id": "123456"       
“time”:“2024-09-18T12:00:01Z” ,“level”:“DEBUG” ,“message”:“检查用户凭据” ,“user_id”:“123456”       
“time”:“2024-09-18T12:00:02Z” ,“level”:“INFO” ,“message”:“用户凭据已验证” ,“user_id”:“123456”       
“time”:“2024-09-18T12:00:03Z” ,“level”:“INFO” ,“message”:“生成会话令牌” ,“user_id”:“123456”       
“time”:“2024-09-18T12:00:04Z” ,“level”:“INFO” ,“message”:“会话令牌已生成” ,“user_id”:“123456” ,“session_id”:“abcde12345”         
"time": "2024-09-18T12:00:05Z" , "level": "INFO" , "message": "用户登录成功" , "user_id": "123456" , "session_id": "abcde12345"         
单个日志条目:

“time”:“2024-09-18T12:00:00Z” ,“duration_ms”:“5000” ,“message”:“用户登录已验证” ,“user.credentials.verified” :true ,“request_id”:“req-789xyz” ,“user_id”:“123456” ,“session_id”:“abcde12345”            

由服务记录,有时称为规范日志,因为它完全代表一个请求。此示例也称为广泛事件,因为它用许多字段描述一个重要事件。

如果很难将所有信息累积到对记录器的一次调用中,请考虑创建一个跟踪跨度。可以在整个工作单元中将信息添加到跨度中。 

3. 使用唯一标识符
生成一个唯一的标识符,当请求从软件系统外部到达时,并将其包含在该请求引起的所有处理中。

理想情况下,系统中的每个服务都会输出一个规范日志,并通过唯一标识符(例如请求 ID 或跟踪 ID 字段)进行关联。这些标识符有助于更快地调试复杂问题,并支持跨系统和服务跟踪特定操作、请求或用户。

4. 标准化结构化日志中的日志字段名称和类型 
将日志转换为标准OpenTelemetry 模型。在服务中使用标准字段名称和类型可以更轻松地搜索、分析和关联日志。如果没有一致的格式,日志可能会变得碎片化,从而导致问题检测速度变慢并增加复杂性。 

5. 避免记录敏感数据
日志不应包含敏感信息,例如密码、信用卡详细信息或个人身份信息 (PII)。记录敏感数据可能会导致安全漏洞或违反合规性。确保敏感信息被屏蔽、从日志中完全排除或使用集中日志管理系统进行妥善管理。


6. 将日志视为数据
如果没有有效的日志分析,即使是结构良好的日志也会变得难以管理,难以识别模式、检测异常或追踪问题的根本原因。过滤您的日志。使用请求 ID、用户 ID、URL 路径或错误代码等字段的组合,您可以将日志范围缩小到仅相关条目,从而加快故障排除过程并确保您专注于可操作的见解。

对代表用户操作的日志进行计数可以提供应用程序指标,例如 API 被调用的次数以及成功率。如果日志包含请求持续时间,则聚合这些日志可以提供详细的延迟统计信息。这些应用程序指标甚至比通常的时间序列聚合更有价值,因为它们由详细的日志条目支持,您需要这些条目来调试错误并解决延迟增加的问题。

7. 使用集中式日志管理系统
在分布式系统中,日志通常分散在不同的服务、服务器和区域,这使得日志整合和管理变得困难。使用集中式日志管理系统(如 Elasticsearch、Splunk 或 Honeycomb)(例如,使用 OpenTelemetry 发送日志数据)在一个地方收集、汇总和分析日志。这样可以实现更快的搜索、日志分析和更好的跨服务关联。 

集中式日志系统为开发人员和工程师带来了诸多好处,包括灵活的详细日志,可用于在分布式系统中立即进行故障排除,以及合并事件以供长期存储或审计。

8.配置日志保留 
日志对于故障排除、审计和合规性非常有用,但不应无限期地保留。定义保留策略以在一定时间后自动存档或删除旧日志。这可以降低存储成本并确保遵守GDPR等数据保护法规,这些法规可能要求在一定时间后删除日志。

9. 设置警报
日志不仅仅用于历史参考;它们可以触发关键问题的实时警报。为“错误”或“严重”级别的日志或特定情况(例如重复登录失败、内存使用率高或服务缺失)设置警报。强大的日志分析策略应包括警报,以便您的团队能够在事件升级为更大问题之前快速做出响应。

10. 记录日志格式和做法
确保您的日志格式、日志记录实践和政策有据可查。开发人员、DevOps 团队和其他利益相关者应该知道如何生成和解释日志。正确的文档可以提供清晰度并确保每个人都遵循相同的准则,尤其是在团队发展或加入新成员时。

您的文档中应包含的关键部分:

  • 日志格式规范(字段、数据类型)
  • 日志级别定义
  • 保留策略
  • 敏感数据处理指南
  • 使用的记录工具和系统

结论
良好的日志记录实践对于系统可观察性、故障排除和大规模维护性能至关重要。如果没有适当的实践,日志可能会变得杂乱无章、毫无用处,甚至成为负担。在这篇博客中,我们分享了十种最佳实践,以最大限度地提高您的日志记录工作效率并解答与性能、安全性和行为相关的系统问题。 

通过构建日志、标准化格式、使用唯一标识符以及实施日志轮换和保留,您可以确保日志保持可操作性和高效性。集成集中管理、避免敏感数据和记录实践有助于确保系统的安全性和可扩展性。 

工程师和开发人员可以采用此处分享的概念来构建卓越生产所需的 结构化事件。