日志框架介绍
分别对应下图中除 commoms-logging
外的四个日志框架:
SLF4J
不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层
,对日志框架制定的一种规范、标准、接口
。
所有SLF4J
并不能独立使用,需要和具体的日志框架配合使用
。
SLF4J 框架
SLF4J
就是其他日志框架
的门面
。
SLF4J
可以理解为是提供日志服务
的统一 API 接口
,并不涉及到具体的日志逻辑实现
。
不引入日志门面
常见的日志框架有log4J
, logback
等。
如果一个项目已经使用了log4j
,而你依赖的另一个类库:
- 假如是
Apache Active MQ
,它依赖于另外一个日志框架logback
,那么你就需要把logback
也加载进去。
存在问题:
- 不同
日志框架
的API接口
和配置文件
不同,如果多个日志框架共存,那么不得不维护多套配置文件(这个配置文件是用户自定义的配置文件)。 - 如果要
更换日志框架
,应用程序
将不得不修改代码,并且修改过程中可能会存在一些代码冲突
。 - 如果引入的
第三方框架
,使用了多套,那就不得不维护多套配置
。
引入日志门面
引入门面日志框架之后,应用程序
和日志框架(框架的具体实现
)之间有了统一的API接口
(门面日志框架实现);
此时应用程序只需要维护一套日志文件配置
,且当底层实现框架
改变时,也不需要更改应用程序代码
。
SLF4J
就是这个日志门面
。
总的来说,SLF4J
使你的代码独立于任何一个特定的 日志API
,这是一个对于开发 API 的开发者很好的思路。
日志使用
Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:
它打印的日志和System.out.print
有什么不同呢?
比如,我们通过打印时间日志,观察程序运行消耗时间:
重新运行程序,去页面中多点击几次验证码图片:
回到后端,观察打印日志:
可以看到,我们通过System.out.print
打印的日志,比SpringBoot
打印的日志缺少了很多信息。
SpringBoot
内置了日志框架Slf4j
,我们可以直接在程序中调用Slf4j
来输出日志。
打印日志
打印日志的步骤:
- 在程序中得到日志对象。
- 使用日志对象输出要打印的内容。
在程序中得到日志对象
我们先来重新创建一个项目:
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:
private static Logger logger = LoggerFactory.getLogger(LogController.class);
LoggerFactory.getLogger
需要传递一个参数,标识这个日志的名称。- 这样可以更清晰的知道是哪个类输出的日志;当有问题时,可以更方便直观的定位到问题类。
- static 也可以不加,按照需求来添加 static ,final 等;
注意:Logger 对象
是属于org.slf4j
包下的,不要导入错包。
此时,我们就定义好了一个日志对象:
使用日志对象打印日志
日志对象的打印方法有很多种,我们可以先使用info()方法来输出日志,如下代码所示:
重新运行程序,访问页面 http://127.0.0.1:8080/log/print,打印日志效果展示:
日志格式的说明
打印的日志分别代表什么呢?
日志级别的分类
日志的级别从高到低依次为:FATAL
、ERROR
、WARN
、INFO
、DEBUG
、TRACE
FATAL
:- 致命信息,表示需要立即被处理的系统级错误。
ERROR
:- 错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。
WARN
:- 警告信息,不影响使用,但需要注意的问题。
INFO
:- 普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等。
DEBUG
:- 调试信息,需要调试时候的关键信息打印。
TRACE
:- 追踪信息,比 DEBUG 更细粒度的信息事件(除非有特殊用途,否则请使用DEBUG级别替代)。
- 日志级别通常和测试人员的Bug级别没有关系。
- 日志级别是开发人员设置的,用来给开发人员看的。
- 日志级别的正确设置,也与开发人员的工作经验有关。
- 如果开发人员把 error 级别的日志设置成了info,就很有可能会影响开发人员对项目运行情况的判断。
- 出现error级别的日志信息较多时,可能也没有任何问题。
- 测试的bug级别更多是依据现象和影响范围来判断
日志级别的顺序
级别越高,收到的消息越少
日志级别的使用
日志级别是开发人员自己设置的。开发人员根据自己的理解来判断该信息的重要程度
类似公司管理,通常由领导来判断什么样的事情需要汇报,什么样的事情不需要汇报。
针对这些级别,Logger对象分别提供了对应的方法,来输出日志:
观察打印的日志结果,结果发现,只打印了info
、warn
和 error
级别的日志,这与日志级别的配置有关,日志的输出级别默认是info级别,所以只会打印大于等于此级别的日志,也就是info
、warn
和error
。
- SpringBoot 默认的日志框架是
Logback
,Logback
没有FATAL
级别,它被映射到ERROR
。- 出现
fatal
日志,表示服务已经出现了某种程度的不可用,需要系统管理员紧急介入处理。- 通常情况下,
一个进程生命周期中应该最多只有一次FATAL记录
。