(一)认识日志
认识日志:
我们从最初学习计算机的时候就会使用printf打印日志了,通过日志我们可以打印出我们想要的数据,进一步学习我们可以学会了通过打印日志来发现和定位日志,或者根据日志来分析程序运行过程,在我们现在学习spring时也会根据控制台的日志来看我们的报错信息等
我们现在来打印个日志看一下
我们发现我们自己写的日志跟spring给我们打印出的日志简直是天差地别,我们打印出的日志好像并不能很好的满足我们的需求,这时候我们就需要学习spring的方式,使用专门的日志框架
我们使用日志框架后发现确实跟spring打印出来的日志很相似了,那具体日志框架该怎么使用,具体参数是什么意思,我们等一会再讲,我们先来看一下日志有什么用
日志用途:
1.系统监控
我们在以后工作的时候,我们不可能一直坐在电脑面前看着我们的程序执行,所以我们需要通过日志记录这个系统的运行状态,每一个方法的时间和状态,并且对数据分析,设置不同的规则,如果这个规则被打破,就要给我们示警,比如我们可以统计日志中关键字数量,如果数量过多,就要给我们示警
2.数据采集
我们可以通过日志来采集用户数据,采集的数据可以作用很多方面,比如数据统计,和推荐排序
数据统计&推荐排序:我们在redis中set和zset那篇博客说集合可以帮我们统计pv,也就是用户的访客量,并且我们在推荐排序时也可以用zset来排序,而他们的数据。就可以从日志中获取
3.日志审计
随着互联网发展,互联网的安全越来越受到关注,系统安全也是项目中很重要的环节,所以我们国家发布法规,我们需要通过系统日志的分析,能判断出一些非法攻击和非法调用,以及系统处理过程中的安全隐患。(比如谁对数据进行了修改,我们要能找到是谁操作的)
(二)日志使用
1)打印日志
我们springboot内置了日志框架slf4j,所以我们也可以在程序中调用slf4j来输出日志
打印日志的步骤:1.在程序中得到日志对象 2.使用日志对象输出要打印的内容
1.获取日志对象
我们在getLooger中要传递一个参数,来表示这个日志的名称,这样可以更清晰知道是哪个类输出的日志,如果出错更方便我们找到错误类
同时注意
这是我们需要导的包,之前我导入错了包,导致整个项目都跑不起来
2.使用日志对象打印日志
我们可以看到我们在info中输入的内容,在右下角被打印了出来
2)日志框架的介绍
我们说spring使用了slf4j框架,但是整个框架也不是一个真正的日志实现,而是一个抽象层,他对现有的一些日志框架制定了一种规范标准,也就是slf4j就是个接口,所以slf4j,需要和具体的日志框架配合使用
1.门面模式
定义:门面模式又称为外观模式,他提供了统一的接口,用来访问子系统中的一群接口,其主要特征是定义了⼀个⾼层接⼝,让⼦系统更容易使⽤.
我个人看来,这个就类似于封装,我们这个高层接口封装了子系统的功能,我们通过调用高层接口来访问子系统的功能
门面模式主要有两种角色:
1.外观角色(也就是我们的高层接口):也称门面角色,系统对外的统一接口
2.子系统角色:我们可以同时拥有一个或多个子系统角色,每个又不是一个单独的类,只是一个类的集合,而我们子系统并不知道门面角色,对于子系统角色。门面角色就只是一个客户端而已
门面模式的优点:
1.实现了客户端与子系统的解耦合,这就让子系统的变化不会影响到调用它的客户端
2.提高了灵活性,我们客户端不关心子系统的实现方式与接口,只关心与门面对象的交互
2.slf4j框架介绍
slf4j就是其他日志框架的门面,可以理解为提供日志服务的统一API接口,并不涉及到具体日志逻辑实现
如果我们不引入日志门面,我们上面的图上说,我们slf4j是log4j,logback,jul的接口,如果一个项目使用了log4j,但是我们依赖的另一个库,如果这个库依赖于另一个日志框架,我们还要加载另一个日志框架。
如果这样的话,就会导致我们要引入多个配置文件,使用多个api接口,那么就代表我们要维护多套配置文件,而且如果我们要更换日志框架,我们就需要修改代码,这对于我们程序员的工作量又是一个大提升
如果我们引入日志门面,我们应用程序和日志框架就有了一个统一的api接口,此时我们应用程序只需要维护一套日志文件的配置,并且就算底层框架接口有所改变,我们的接口也不用改变
我们的slf4j就是这个日志门面
3)日志格式的说明
1.时间日期:我们这个日志是在什么时候打印的
2.日志级别:error,warn,info,bebug,trace
3.进程ID
4.线程名
5.logger(通常使用源代码类名,方便我们定位位置)
6.日志内容
4) 日志级别
日志级别代表日志信息对应问题的严重性,是为了我们更快的筛选出重要信息的
有了日志级别后,如果我们要筛选出error级别的日志信息,就可以在配置文件中更改
1.日志级别的分类
日志级别由高到低依次为:fatal,error,warn,info,debug,trace
• FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.
• ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.
• WARN:警告信息,不影响使⽤,但需要注意的问题
• INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.
• DEBUG:调试信息,需要调试时候的关键信息打印. • TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
我们这里要注意,日志级别也是开发人员设置,目的是给开发人员看的,所以我们日志级别是否合理,还是要看开发人员的理解,所以有可能我们全是error级别的日志,但是还是能正常运行
2.日志级别的使用
我们调用了logger中所有日志级别的打印,我们发现没有fatal,因为springboot中默认框架是logback,logback中没有fatal级别,所以可以用error来映射到,而且一旦出现fatal,就说明是有严重的错误了,我们也不需要打印日志了
但是我们打印出来发现,只有info,warn,error级别的日志,这是因为我们日志的默认输出级别是info,所以只输出大于等于这个级别的日志
5)日志配置
1.配置日志级别
日志级别配置只需要在配置文件中设置logging.level配置项就可以
这样我们默认的日志级别就是debug
2.日志持久化
我们上述的日志都是在控制台上的,但是我们工作在线上环境中,我们就需要把日志保存,以便出现问题时,发现问题,把日志保存下来就叫持久化。
这里我们用yml配置,后面可以跟绝对路径或者相对路径
我们也可以使用
这样会在我们设置的路径下创建一个日志文件
如果我们这两个都进行配置了,我们会以logging.file.name为主
3.配置日志文件分隔
我们日志文件是很多的,如果都放在一个文件中,不仅会导致文件过大,也不方便我们观察,所以日志框架给我们提供了一个功能,就是日志文件到一定大小就会进行分割,如果日志文件超过10M就自动进行分隔,当然这个大小我们是可以调节的
日志文件超过1kb分隔,这里是为了方便展示,一般我们是不会分这么小的,分隔后端日志文件名为:日志名.日期.索引
4.配置日志格式
目前日志打印的格式默认的,但是也是支持我们手动配置的
我们发现为什么我们这里设置了颜色但是却没有生效,这个需要我们手动改一下配置,让idea支持控制台颜色显示
并且输出
这样就可以让我们的控制台显示颜色了
(三)使用注解让日志输出
我们发现我们每次输出都要使用getLogger很麻烦,并且每个类都要添加一边,Lombok给我们提供了一种更简单的方式
1.添加lombok框架支持
2.@slf4j注解
然后我们直接调用info方法就可以打印日志了
那我们可能会好奇这个log是哪来的,这就是我们@slf4j这个注解给我们提供的一个日志对象,我们反编译一下看看
我们发现确实是这样,而且跟我们自己写的logger简直一模一样
(四)总结
日志是我们不可缺少的,使用日志可以快速发现和定位问题,springboot给我们集成了日志框架slf4j,然后spring日志框架内部是使用logback,默认情况下我们讲info级别以上的日志输出到控制台,我们可以通关@slf4j注解和log对象快速打印自定义日志
我们可以通过更改配置文件,更改默认日志级别,使日志持久化,更改配置日志的打印格式等