目录
日志的作用
日志的打印
常见的日志框架
自定义的日志打印
为什么不用sout来打印日志
Spring Boot日志打印
1.得到日志对象
2.使用日志对象提供的方法打印日志
日志级别
日志级别的顺序
日志级别的设置
日志持久化
配置日志文件的保存路径
配置日志文件的文件名
日志文件最大说明
更简单的日志输出-lombok
lombok原理
快速添加Spring Boot依赖
日志的作用
- 通过查看日志,来排除和定位问题,这也是日志最主要的通途.
- 记录用户的登录日志,方便分析用户是正常登录还是恶意破解用户.
- 记录系统的操作日志,方便数据恢复和定位操作人.
- 记录程序的执行时间,方便以后优化程序提供数据的支持.
日志的打印
当我们在启动Spring Boot项目的时候,控制台里已经有日志的打印了.
这些都是系统打印的日志.
这就说明Spring Boot是已经内置了日志框架的,如果不内置是无法进行日志的打印的.
那么开发者应该如何自定义打印日志呢?控制台打印的日志并非是持久化的,那么怎么持久化的保存日志呢?
常见的日志框架
Spring Boot内置的日志框架是SLF4J和logback.
日志门面是设计模式的一种,门面模式.日志门面的身份就类似于中间代理.当我们要打印日志的时候,我们的请求是首先到达日志门面,由日志门面里的框架,根据我们的配置和驱动来决定最后使用哪一个日志实现的框架.
这样做的好处就是当当前的日志实现的框架挂掉了之后,我们可以自然衔接到另一个日志实现框架,无需对代码进行大量的修改.
自定义的日志打印
为什么不用sout来打印日志
不用sout来打印日志的原因:
- 相比于系统打印的日志来说,sout打印的日志少了很多信息,比如日志的打印时间和打印日志的位置
- sout没有日志级别的控制
- sout打印的日志不能持久化保存,并且生产环境是后台启动项目,无法看到控制台打印的信息.
Spring Boot日志打印
1.得到日志对象
日志对象是私有的,每个类对应到一个日志对象.
日志对象是定义在类里的,而不是方法里,所以日志对象的作用范围是整个类.
2.使用日志对象提供的方法打印日志
log点出来的方法有很多,都是对应到不同日志级别的打印方法.
访问sayHi,查看控制台信息.
可以看到只打印了三条,trace和dubug没有打印.
这是因为默认的日志级别是info,只有info及以上级别的日志才能被打印.
日志级别
日志级别的顺序
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
级别设置的越高,收到的信息越少.如果级别设置了warn,那么就只能收到warn,error和fatal级别的日志了.
日志级别的设置
通过在配置文件中设置logging.level配置项.
此时启动项目,查看控制台:
没有日志的打印,这是因为我们的日志级别设置成了error,没有日志的打印说明没有错误日志.
访问sayHi,查看控制台:
可以看到日志的打印,同时也打印了trace和dubug,这是因为我们设置com.example.demo.controller下的日志级别是trace.
日志持久化
我们上面日志的输出都是在控制台上,但是在生产环境下我们需要把日志都保存下来,以便出现问题之后通过日志来定位问题,把日志保存下来的过程就叫做持久化.
日志持久化很简单,只需要在配置文件中指定日志的存储目录或者指定日志保存的文件名,Spring Boot就会把控制台的日志写到响应的目录或者文件下了.
配置日志文件的保存路径
访问sayHi
可以看到控制台打印了日志
同时,在D:\\log下生成了一个spring.log文件,打开查看,发现也有了日志内容.
再次访问sayHi,日志内容会追加,而不会覆盖.
配置日志文件的文件名
再次启动项目,访问sayHi.
可以看到,在我们只设置名字而不设置路径的时候,日志会默认保存在当前项目的路径下.
我们也可以在name里设置路径+名字,这样就日志可以保存在我们设置的路径下了.
访问sayHi
可以看到在我们设置的路径下生成了springboot.log
日志文件最大说明
所以关于日志的持久化我们得出一个结论:日志文件一旦产生,那么日志文件及其内容就会永久的保存,不会出现文件或内容的丢失,无论任何操作都会保持以上这一特性.
那这样会不会出现一个问题:当我们保存日志的文件一直积累日志内容,文件大到我们无法打开 ?
答案是不会的,Spring Boot帮我们做了规定.
这是spring官网关于系统配置项的说明.
官网系统项说明的网址:Common Application Properties
也就是说一旦日志文件超过了10MB,Spring Boot会在相同的目录下自动帮我们生成一个日志文件,来保存接下里的内容(新文件的名字会有-1,-2的标识),这就起到了日志分割的作用.我们也可以主动去设置文件最大的值.
更简单的日志输出-lombok
这是lombok插件提供给我们的注解,使用这个注解前提是安装了lombok插件并且引入了lombok的依赖.
这样就可以在代码里省去logger对象的创建.
lombok原理
lombok框架的是在编译的时候起作用的,在编译的时候,lombok会根据我们给出的lombok注解来实现相应的作用.
使用lombok和不是用过lombok最终生成的字节码是一样的,所以lombok不会改变运行的效率.
使用lombok只是帮我们省去了手写部分代码的麻烦,它会在编译期间,帮我们将对应的代码写到类当中去.
我们可以在idea中查看,来验证我们所说的.
target目录下就是程序运行时所生成的字节码文件,我们可以直接在idea中查看,idea会自动的将字节码转为Java程序.
我们可以看到,生成的字节码文件里是有创建log对象这一过程的.
快速添加Spring Boot依赖
如果我们在Spring Boot项目创建的时候没有引入依赖,等项目创建好之后,我们依然可以在pom.xml文件中引入对应的依赖,可以通过原始的方式,去maven仓库拷贝,但是这一过程太过麻烦,而且还要考虑版本适配的问题.
因此我们可以使用EditStarters插件来实现快速添加依赖的功能.
步骤:
1.安装完插件之后,重启idea.
2.在pom.xml文件中右键,点击生成,点击EditStarters,就可以进入页面来添加依赖.
这样依赖就自动添加到pom.xml中了,最后点击reload即可.