服务端日志打印最佳实践
# 1. 为什么要打印日志
在后端开发中,日志的打印具有重要的意义,当系统在线下调试时,能够详细输出过程参数,以及上线后,系统出问题时,能够有记录可查看。
# 2. 日志级别的种类
日志级别种类总共为 4 类,如下所示(不允许再添加其他级别的日志,比如:trace):
ERROR
>WARN
>INFO
>DEBUG
日志级别依次递减。
# 3. 各种日志级别的使用场景
ERROR
日志级别使用场景(本质: 系统出现严重错误、或者未知的错误,需要马上处理!!! )- 所有的异常相关的日志,都应该用
ERROR
级别日志来打印,除非后面,这类日志觉得不重要,可以降级为WARN
级别。 - 如果代码中确定某种流程或者分支一定不会出现,也可以打印为
ERROR
级别的日志(特别是在 if/else 分支的场景)。
- 所有的异常相关的日志,都应该用
WARN
日志级别使用场景(本质: 系统出现问题,但是不足以影响主流程,可在当天内处理掉!!!)- 参数校验异常一般用
WARN
级别打印日志。 - 重试时,打印中间的状态过程,使用
WARN
级别日志。 - 某些场景(不影响主流程)
ERROR
级别日志降级为WARN
- 参数校验异常一般用
INFO
日志级别使用场景(本质: 记录状态的日志,用于了解系统的运行情况!!!)- 定时任务运行时,开始和结束的打印日志使用
INFO
级别日志。 - 项目启动成功时,一些参数的打印使用
INFO
级别日志。 - apollo配置的变更,使用
INFO
级别日志,记录状态的变更。 - 初始化任务,使用
INFO
级别日志,就初始化日志的开始和结束时间 - 慢日志的打印,使用
INFO
级别打印。
- 定时任务运行时,开始和结束的打印日志使用
DEBUG
日志级别使用场景(本质: 用户线下环境进行调试时的中间过程打印,线上一般不开启!!!)- 线下环境的入参以及返回值的打印。
# 4. 不同环境使用级别
- 线下环境使用(最低级别
DEBUG
):ERROR
>WARN
>INFO
>DEBUG
- 线上环境使用(最低级别
INFO
):ERROR
>WARN
>INFO
# 5. 线上日志如何监控
线上的日志级别监控分为两大类:
ERROR
日志监控告警,告警发送到企业微信小组群。WARN
日志监控告警,告警发送到企业微信小组群。
# 6. 持续的日志优化
【重要】 打印日志好比写一篇文章,不可能一开始就把一篇文章写好。一份高效、质量高的日志,需要大家持续的优化。比如:好的日志能够在出问题的时候,清楚的知道什么人在什么时间做了什么事,以及出错的时候能够串联尽可能的上下文信息(即4H+1W)。
实践准则:
- 遵循上面的日志级别输出准则
- 开发的时候要时刻反复推销线上可能出现的问题,出问题时,我的日志是否能够清晰的反应当时的问题
- 至少要在线上的环境,完整的看下自己打印的日志是否合理,是否有效
- 上线后,观察线上的日志是否该打的都打了,不该打的没有打,如果有不合理的地方,即时发版更新下(修改和添加日志不会影响业务功能),在之后发现不合理的时候,可以单独发掉或者跟着新的需求一起发布掉
- 线上的
ERROR
级别日志要达到分钟级或者至少小时级别处理 - 线上的
WARN
级别日志要在天级别内处理掉 - 持续的关注线上的日志是否合理,罗马不是一天建成的
小技巧
如何让日志在控制台打印的更优雅?
'%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) ${PID} %X{traceId} --- "%thread" "%F:%L" "%cyan(%logger{50})" : "%msg"##%n'
上次更新: 2023/03/22, 15:21:20