在软件开发的世界里,日志记录常常被视为一项琐碎的任务,直到深夜出现生产问题,开发人员才意识到其重要性。面对毫无头绪的海量日志,寻找问题根源犹如大海捞针。本文将分享 12 个日志记录最佳实践,帮助您避免此类噩梦。
1. 制定清晰的日志记录策略
不要漫无目的地添加日志语句,期望其中一些有用。在编写任何日志之前,请思考以下问题:
- 应用程序的主要目标是什么?
- 哪些关键操作需要监控?
- 哪些关键性能指标 (KPI) 对您至关重要?
例如,错误日志的目标不仅仅是发出“某处出现故障”的信号,而是提供足够的上下文信息来解决问题。
2. 正确使用日志级别
- 信息 (Info): 用于记录常规业务操作,例如成功的用户登录或重要交易。
- 警告 (Warning): 表示潜在问题,例如支付处理时间过长。
- 错误 (Error): 指示严重问题,例如支付失败或服务崩溃。
- 致命 (Fatal): 表示系统崩溃等灾难性事件。
在生产环境中,大多数应用程序默认使用“信息”级别以保持简洁。但调试错误时,应临时提高详细程度,并提供管理详细程度的方法。
3. 使用结构化日志记录
传统的非结构化日志难以被机器理解。结构化日志为每条信息分配一个字段,使其更易于过滤、搜索和分析。 许多日志记录框架都支持结构化日志,例如 Vector 可以将非结构化日志转换为 JSON 格式。
4. 提供全面的上下文信息
每个日志条目都应包含以下信息:
- 请求 ID (用于跨微服务跟踪请求)
- 用户 ID (如果需要)
- 系统状态数据 (例如数据库或缓存状态)
- 完整的错误上下文 (包括堆栈跟踪)
5. 利用日志采样
对于高流量系统,存储所有日志既昂贵又不必要。日志采样只存储一部分有代表性的日志。例如,可以使用 20% 的采样率记录身份验证服务的每次登录尝试。 可以根据需要调整采样率,例如保留所有错误日志,但对成功日志进行更积极的采样。
6. 创建规范的日志行
规范的日志行是指包含完整故事的单个日志条目,类似于电影摘要。例如,在每个请求结束时,创建一个包含所有重要信息的日志条目,包括用户尝试的操作、用户身份、问题所在、耗时以及数据库操作时间。
7. 集中化日志管理
将所有日志收集到一个中心位置,以便跨所有服务进行搜索,查看不同服务之间的问题影响,并确保整个团队查看相同的数据。
8. 实施日志保留策略
制定一个保留策略,例如:
- 将近期日志保留在易于访问的位置,以便快速调试。
- 将较旧的日志移动到更便宜的冷存储。
- 最终删除不再需要的日志。
9. 确保日志安全
日志通常包含敏感信息,例如用户 ID、IP 地址和数据库查询。通过以下方式保护日志:
- 传输中加密
- 静态加密
- 访问控制
10. 避免记录敏感信息
切勿记录密码、API 密钥或其他敏感信息。 使用过滤器在日志进入存储之前自动屏蔽敏感信息。
11. 优化日志记录性能
- 选择高效的日志记录库。
- 在高流量路径中使用日志采样。
- 将日志记录到单独的磁盘分区。
- 尽早进行负载测试以发现瓶颈。
12. 不要将日志用于所有用途
日志非常适合调试,但不适用于实时监控。使用指标来跟踪系统运行状况和趋势,并在问题发生之前发出警报。
遵循这些最佳实践,可以简化调试过程,避免代价高昂的生产问题,并提高应用程序的整体安全性和性能。