⽇志使⽤ Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所⽰:

它打印的⽇志和 System.out.print 有什么不同呢

可以看到,我们通过 System.out.print 打印的⽇志,⽐SpringBoot 打印的⽇志缺少了很多信息
SpringBoot 内置了⽇志框架Slf4j ,我们可以直接在程序中调⽤Slf4j 来输出⽇志
打印⽇志
打印⽇志的步骤:
• 在程序中得到⽇志对象.
• 使⽤⽇志对象输出要打印的内容.
在程序中得到⽇志对象 在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory,如下代码所⽰:

使⽤⽇志对象打印⽇志 ⽇志对象的打印⽅法有很多种,我们可以先使⽤info()⽅法来输出⽇志,如下代码所⽰:

打印⽇志效果展⽰:

⻔⾯模式(外观模式)
SLF4J是⻔⾯模式的典型应⽤(但不仅仅使⽤了⻔⾯模式).
⻔⾯模式定义 ⻔⾯模式(FacadePattern)⼜称为外观模式,提供了⼀个统⼀的接⼝,⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝,让⼦系统更容易使⽤.

⻔⾯模式主要包含2种⻆⾊: 外观⻆⾊(Facade):也称⻔⾯⻆⾊,系统对外的统⼀接⼝. ⼦系统⻆⾊(SubSystem):可以同时有⼀个或多个SubSystem.每个SubSytem都不是⼀个单独的类, ⽽是⼀个类的集合.SubSystem并不知道Facade的存在,对于SubSystem⽽⾔,Facade只是另⼀个 客⼾端⽽已(即Facade对SubSystem透明)
⽐如去医院看病,可能要去挂号,⻔诊,化验,取药,让患者或患者家属觉得很复杂,如果有提供接待⼈ 员,只让接待⼈员来处理,就很⽅便.

场景:回家,我们会开各个屋的灯.离开家时,会关闭各个屋的灯 如果家⾥设置⼀个总开关,来控制整个屋的灯就会很⽅便.
⻔⾯模式的优点
• 减少了系统的相互依赖.实现了客⼾端与⼦系统的耦合关系,这使得⼦系统的变化不会影响到调⽤它 的客⼾端;
• 提⾼了灵活性,简化了客⼾端对⼦系统的使⽤难度,客⼾端⽆需关⼼⼦系统的具体实现⽅式,⽽只需 要和⻔⾯对象交互即可
• 提⾼了安全性.可以灵活设定访问权限,不在⻔⾯对象中开通⽅法,就⽆法访问
SLF4J 就是其他⽇志框架的⻔⾯.SLF4J可以理解为是提供⽇志服务的统⼀API接⼝,并不涉及到具体的 ⽇志逻辑实现.
引⼊⻔⾯⽇志框架之后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置,且当底层实现框架改变时,也不需要更改应⽤程序代 码

⽇志格式的说明
打印的⽇志分别代表什么呢?

从上图可以看到,⽇志输出内容元素具体如下:
-
时间⽇期:精确到毫秒
-
⽇志级别:ERROR,WARN,INFO,DEBUG或TRACE
-
进程ID
-
线程名
-
Logger名(通常使⽤源代码的类名)
-
⽇志内容
⽇志级别
⽇志级别代表着⽇志信息对应问题的严重性,为了更快的筛选符合⽬标的⽇志信息.
⽇志级别的分类
⽇志的级别从⾼到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
• FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.
• ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.
• WARN:警告信息,不影响使⽤,但需要注意的问题
• INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.
• DEBUG:调试信息,需要调试时候的关键信息打印.
• TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

⽇志级别的使⽤
⽇志级别是开发⼈员⾃⼰设置的.开发⼈员根据⾃⼰的理解来判断该信息的重要程度 类 似公司管理,通常由领导来判断什么样的事情需要汇报,什么样的事情不需要汇报. 针对这些级别,Logger对象分别提供了对应的⽅法,来输出⽇志.

观察打印的⽇志结果:

结果发现,只打印了info,warn和error级别的⽇志 这与⽇志级别的配置有关, ⽇志的输出级别默认是info级别,所以只会打印⼤于等于此级别的⽇志,也就 是info, warn和error
⽇志配置
上述是⽇志的使⽤,⽇志框架⽀持我们更灵活的输出⽇志,包括内容,格式等.
配置⽇志级别
⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所⽰:配置,properties和yml只需要配置其中⼀个即可.
以下两个配置,根据项⽬使⽤其中之⼀.
Properties配置

yml配置

重新运⾏上述代码,观察结果:

⽇志持久化
以上的⽇志都是输出在控制台上的,然⽽在线上环境中,我们需要把⽇志保存下来,以便出现问题之后追 溯问题.把⽇志保存下来就叫持久化. ⽇志持久化有两种⽅式
1. 配置⽇志⽂件名
2. 配置⽇志的存储⽬录

配置⽇志⽂件的路径和⽂件名:


配置⽇志⽂件的保存路径


注意:
logging.file.name 和 logging.file.path 两个都配置的情况下,只⽣效其⼀,以 logging.file.name 为准.
配置⽇志⽂件分割
如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,需要对⽇志⽂件进⾏分割. 当然,⽇志框架也帮我们考虑到了这⼀点,所以如果不进⾏配置,就⾛⾃动配置 默认⽇志⽂件超过10M就进⾏分割



更简单的⽇志输出
每次都使⽤LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,lombok给我们提供了 ⼀种更简单的⽅式.
1. 添加lombok框架⽀持
2. 使⽤ @slf4j 注解输出⽇志。

lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象log,我们直接使⽤就可以.
