1.打印日志
SpringBoot内置了日志框架slf4j,可以直接在程序中调用slf4来输出日志.可以通过在程序中得到日志对象,并使用日志对象输出要打印的内容.
1.1在程序中得到日志对象.
在程序中获取日志对象需要使用日志工厂LoggerFactory,LoggerFactory.getLogger()需要传递一个参数,标志这个日志的名称.这样可以更清晰的知道是那个类输出的日志,当有问题时,可以更方便直观的定位到问题类.
1.2使用日志对象打印日志
这里使用info来打印日志
打印日志的效果
1.3日志框架
slf4j不是一个真正的日志实现,而是一个抽象层,是对日志框架的一种规范.slf4j并不能独立使用,需要和具体的日志框架配合使用.slf4j是门面模式的典型应用.
1.4门面模式
门面模式又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口.其主要特征是定义了一个高层接口,让子系统更容易使用.要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用.
门面模式主要包含两种角色:
外观角色(Facade): 也称为门面角色,系统对外的统一接口. 子系统角色(Subsystem):可以同时有一个或多个subSystem,每个subSystem都不是一个单独的类,而是一个类的集合.Subsystem并不知道Facade的存在,对于SubSystem而言,Facade只是另外一个客户端而已.一个去医院看病的例子可以很好的解释这个模式:
病人不再自己去挂号,门诊,缴费.可以通过接待员来完成(这里的接待员就相当于外观角色).
一个应用了门面模式的场景:天黑时,需要打开各个屋子的灯,天亮时,需要关闭各个屋子的灯.这里设置一个总开关,控制所有的灯光.
灯的功能:
三种灯:
灯的门面:
实现开灯和关灯:
门面模式的优点:减少了系统的相互依赖,实现客户端和子系统的耦合关系,使得子系统的变化不会影响到调用它的客户端.提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需和门面对象交互即可.提高了安全性,可以灵活设置访问权限,不在门对象中开通方法,就无法访问.
slf4j就是其他日志框架的门面,slf4j可以理解为是提供日志服务的统一API接口,并不涉及具体的日志逻辑实现.
1.5日志的格式说明
从左至右,入职输出的元素依次为:
时间日期:精确到毫秒. 日志级别:INFO 进程ID:26452 线程名 Logger名(通常使用源代码的类名) 日志内容
1.6日志级别
日志级别代表着日志信息对应问题的严重性,日志级别的作用是可以过滤到自己想看的信息,比如只关注error级别的日志,就可以根据级别过滤出来error级别的日志信息,节约开发者的信息筛选时间.日志级别的分类:FATAL: 致命信息,表示需要立即被处理的系统级错误. ERROR:错误信息,级别较高的错误日志信息,不影响系统的继续运行. WARN:警告信息,不影响使用,但需要注意的问题. INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如:系统启动完成,请求处理完成等.DEBUG:调试信息,需要调试时候的关键信息打印. TARCE:追踪信息,比DEBUG更细粒度的信息事件.日志级别是开发人员设置的,用来给开发人员看的.
1.7日志级别的使用
使用logger打印即可.这里输出如下:
这里没有打印 trace 和 debug 级别的日志.这与日志级别的配置有关,日志的默认输出级别是info级别,所以只会打印大于等于此级别的日志,也就是info,warn,error.
1.8日志配置 日志级别默认是info级别,可以在配置文件中设置.这里把日志级别更改为trace.
1.9日志持久化
上面显示日志都是在控制台上输出的,在线上环境中,需要把日志保存下来,以便后续追踪问题.这就是日志的持久化.日志持久化有两种方式.
1.配置文件名
可以看见在这里记录了日志的信息:
2.配置日志的存储.这种方式只能设置日志的路径,文件名为spring.log.
可以看见这个路径下面出现了spring.log的文件.
如果logger.file.name和logger.file.path同时在配置文件中出现,只有logger.file.name生效.
2日志文件的分隔
如果把日志都放在一个文件中,随着项目的运行,日志文件会越来越大,就需要对文件进行分隔.如果没有进行配置,默认的大小为10MB.
这里设置日志文件超过1KB就分割,分割后的日志文件名为:日志名.日期.索引
3.更简单的日志输出
每次都使用 LoggerFactory.getLogger(...class)比较繁琐,每个类都添加一遍,lombok给提供了一种更简单的方式.在添加lombok框架支持之后,使用@Slf4j注解输出日志.lombok提供的@Slf4j会提供一个日志对象log,可以直接使用,不必通过LoggerFactory.getLogger(),得到Logger对象.