书写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. 总结
书写日志就像为汽车买保险,买了保险没出事嫌弃浪费钱,没买保险出事了就很怀念保险。
同一功能的日志要使用相同的标识,出现问题后便于检索。
本文来自博客园,作者:flxx,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/15506916.html