书写log的艺术

0. 重中之重

  • 不能抛异常
  • 要异步输出,不能阻塞业务逻辑
  • 性能尽量高

1. 用途

  • 线上查bug
  • 开发阶段功能验证
  • 学习阶段猜测验证

2. 记录时机

  • 状态变更时
  • 数据变更时
  • 异常返回时
  • 检测输入无效时
  • 定时输出程序的内部资源状态(内存池,线程池,连接池)

3. 严重等级规定

  • critial:必杀技,比如斩杀

    • 致命错误,需要立即停机处理
  • error:频繁中招会死亡的技能,比如猛击

    • 部分功能不可用,程序其他模块功能仍可提供服务
  • warn:伤害小于恢复的技能,比如小于3级的小怪伤害

    • 一次性的,或可恢复的,或不会影响程序继续运行的错误,
    • 比如非法数据或者可能的错误,比如参数输入错误。
  • info:无任何buf与debuf的技能,比如移动WASD

    • 报告程序的进度和状态信息,不会大量输出
    • 比如初始化过程的记录
  • debug:平时使用,但是战斗中也可以使用,比如绷带

    • 调试阶段使用,且项目上线后若出现故障仍会使用,可输入到文件或者屏幕
  • trace:战斗中无法使用的物品,比如面包

    • 调试阶段使用,项目上线后不会使用

4. 都需要记录什么

  • when: 尤其是在异步编程的过程中
    • 记录时间
    • 考虑是否可视化显示
      • 运维:可视化ISO
      • DB备份,则使用tickcount
  • who: 操作者
    • 进程ID
    • 线程ID(死锁会使用)
  • where:越细越好
    • 文件
    • 函数
    • 行号
  • what:简要说明
    • 日志关键词(搜索使用)
  • how:日志影响效率
    • 严重程度,发布时调整为info或以上
  • uid:因为计算机速度太快,分文件存储时无法分辨先后,依赖此uid区分先后顺序
  • why:具体记录内容

[日期 时间] [file:function:line] [process:thread] [level] : keyword => info
[2021-09-21 14:44:21 233] [test.cpp:test_log:33] [12:23] [DEBUG]: test_log => 测试log日志进入
[2021-09-21 14:44:21 235] [test.cpp:test_log:35] [12:23] [DEBUG]: test_log => 测试log日志退出

5. 日志分类

  • 不同模块的信息放不同的文件
  • 不同等级的日志分文件存储

6. 日志开源库

  • spdlog
  • glog(google)
  • zlog

7. 利用日志如何完成溯源功能

  • ???

8. 总结

书写日志就像为汽车买保险,买了保险没出事嫌弃浪费钱,没买保险出事了就很怀念保险。
同一功能的日志要使用相同的标识,出现问题后便于检索。

posted @ 2021-11-04 10:04  flxx  阅读(70)  评论(0编辑  收藏  举报