Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Other
  3. 正文
                           

【调试】12个记录日志的最佳实践

2025-01-10 958点热度 1人点赞 0条评论

在软件开发的世界里,日志记录常常被视为一项琐碎的任务,直到深夜出现生产问题,开发人员才意识到其重要性。面对毫无头绪的海量日志,寻找问题根源犹如大海捞针。本文将分享 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. 不要将日志用于所有用途

日志非常适合调试,但不适用于实时监控。使用指标来跟踪系统运行状况和趋势,并在问题发生之前发出警报。

遵循这些最佳实践,可以简化调试过程,避免代价高昂的生产问题,并提高应用程序的整体安全性和性能。

更多文章:

  1. 系统设计 | 如何表达技术架构?(规划篇)
  2. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  3. 做好技术负责人的4个关键特质
  4. 一次磁盘占用率 100% 的排查记录
  5. 百度工程师浅谈分布式日志
  6. 优秀开源软件的类,都是怎么命名的?
  7. 45 个 Git 经典操作场景,专治不会合代码
  8. LangChain原理学习笔记
  9. 详解微服务应用灰度发布最佳实践
  10. 为什么 TCP 建立连接需要三次握手
标签: 调试 日志 开发 最佳实践
最后更新:2025-01-10

秋天0261

关注Java领域,后端开发、Netty、Zookeeper、Kafka、ES、分布式、微服务、架构等。分享技术干货,架构设计,实战经验等。

打赏 点赞
< 上一篇
下一篇 >
广告
文章目录
  • 1. 制定清晰的日志记录策略
  • 2. 正确使用日志级别
  • 3. 使用结构化日志记录
  • 4. 提供全面的上下文信息
  • 5. 利用日志采样
  • 6. 创建规范的日志行
  • 7. 集中化日志管理
  • 8. 实施日志保留策略
  • 9. 确保日志安全
  • 10. 避免记录敏感信息
  • 11. 优化日志记录性能
  • 12. 不要将日志用于所有用途
最新 热点 推荐
最新 热点 推荐
Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务?
基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代
4款亲测好用的开发画图工具 浅谈DDD中的聚合 Elasticsearch 使用误区之二——频繁更新文档 系统设计 | “胖瘦” BFF:常见的两种微服务形态 DDD系列第五讲:聊聊如何避免写流水账代码 生产环境的CMS垃圾回收,一定要这样配置参数 千万级数据深分页查询SQL性能优化实践 Elasticsearch 字段膨胀不要怕,Flattened 类型解千愁!

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2