写在前面
该文章只考虑了5层日志级别,且适用于初步的日志规范,只解释了何时记录日志、日志应该记录哪些、需要注意的几个基本问题。如果需要了解最佳的日志实践/规范,推荐以下文章:
知乎,最佳日志实践
王健:最佳日志实践
日志的级别
ERROR
ERROR是最高级别错误,反映系统发生了非常严重的故障,极有可能影响系统/程序的正常使用。
对于这类错误,要求将错误的细节记录在日志中,方便后续人工回溯解决。WARN
WARN是低级别异常日志,反映系统在业务处理时触发了异常流程,但是这类错误并不影响系统/程序的正常使用。
对于这类错误,同样要求将错误的细节记录在日志中。INFO
INFO日志主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标。
建议把初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到日志中,方便日常运维工作以及错误回溯时上下文场景复现。DEBUG
DEBUG日志主要用于开发阶段的调试帮助。
建议记录起到调试作用的信息或者其他等级不方便显示的信息,包括参数信息,调试细节信息,返回值信息等等。
记录时机
总结几个需要写日志的点:
- 捕获到异常时。建议用ERROR或者WARN。
- 业务流程出错。常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等等。建议用ERROR或者WARN。
- 系统核心角色,组件关键动作,建议记录INFO级别日志,如果日志频度高或者打印量特别大,可以提炼关键点INFO记录,其余酌情考虑DEBUG级别。
- 系统初始化。核心模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的服务。务必在这里记录INFO日志,打印出参数以及启动完成态服务表述。
日志内容
日志应当提供如下内容:
- 时间,包含时区信息和毫秒,这个工作往往日志框架足以支持。核心属性之一。
- 日志级别,例如 debug、info 以及warn、error
- 会话标识,能知道是哪个客户端或者是哪个用户触发,登陆账号,session信息等
- 功能标识,功能标识的意义在于方便日志搜索,跟踪指定功能的完整轨迹,是INFO,DEBUG日志的常见技巧。跟logger分类同一道理,更细分功能标识则是方法标识,更多使用在DEBUG做在线调试使用。
- 精炼的内容,内容永远是日志的核心,结合上述使用场景,简单来说包括场景信息(谁,什么功能等),状态信息(开始,中断,结束)以及重要参数.
- 其他信息,其他可能的有用信息包括:版本号,线程号等等。
注意事项
- 务必推敲日志的记录级别。
- 注意日志的可读性,不妨在写完代码review这条日志是否通顺,能否提供真正有意义的信息。
- 日志输出是多线程公用的,如果有另外一个线程正在输出日志,上面的记录就会被打断,最终显示输出和预想的就会不一致。
- 线上代码禁止出现各类print等