体系
一是提供了统一的日志门面 API,即图中紫色部分,实现了中立的日志记录 API。
二是桥接功能,即图中蓝色部分,用来把各种日志框架的 API(图中绿色部分)桥接到SLF4J API。这样一来,即便你的程序中使用了各种日志 API 记录日志,最终都可以桥接到 SLF4J 门面 API。
三是适配功能,即图中红色部分,可以实现 SLF4J API 和实际日志框架(图中灰色部分)的绑定。SLF4J 只是日志标准,我们还是需要一个实际的日志框架。日志框架本身没有实现 SLF4J API,所以需要有一个前置转换。Logback 就是按照 SLF4J API 标准实现的,因此不需要绑定模块做转换。
需要理清楚的是,虽然我们可以使用 log4j-over-slf4j 来实现 Log4j 桥接到 SLF4J,也可以使用 slf4j-log4j12 实现 SLF4J 适配到 Log4j,也把它们画到了一列,但是它不能同时使用它们,否则就会产生死循环。jcl 和 jul 也是同样的道理。
级别
1. 要注意工程中配置的优先级,因为会忽略掉低优先级的日志
2. 定义
- ALL 最低等级的,用于打开所有日志记录。
- TRACE 很低的日志级别,一般不会使用。
- DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
- INFO 消息在粗粒度级别上突出强调应用程序的运行过程。这个可以用于生产环境中输出程序运行的一些重要信息。
- WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给开发者的一些提示。
- ERROR 指出发生错误的信息,可能会导致系统出错或是宕机等,必须要避免
- FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
- OFF 最高等级,用于关闭所有日志记录。
3. 使用
- 更加具体的调试信息, 例如调用了什么方法, 参数是什么, 可以使用 trace
- 在项目开发阶段, 调试程序的正确性, 可以使用 debug
- 正常的业务执行流程、系统的启动/关闭、需要做的审计等等都可以使用 info
- 不是错误, 不会影响程序的正常执行, 但是并不建议这样做, 可以使用 warn
- 程序出现了某种错误, 需要介入处理
技巧
1. 合理的记录日志
- 搞清楚当前工程的日志级别,保证日志可以被打印
- 使用参数化形式{}占位 , []行参数隔离
- 日志文件的名称应该是可以自解释的,通常,至少会要求名称中包含类型标识和时间标识
- 日志要有滚动策略,这是考虑到避免单个文件过大,以及磁盘占用问题
2. 日志有意义(正确性)且不冗余(必要性)
- 以实际场景为例来说明如何去做
- 导 HTTP请求的入参和结果
- 远程接口调用(HTTP或RPC)情况
- 特殊的条件分支
3. 不应打印日志
- 大数据量日志 空间的浪费
- 在循环中打日志,特别是大循环, 排查问题困难
- 没有意义的日志 对于系统维护没有帮助
- 如果日志什么都说明不了,那你一定要考虑修改下删除这条日志混清视听
- 密码、邮箱、手机号码属于私密信息,为了避免数据泄露,不应该打数据隐私