一.日志概述
1.为什么要学习日志
日志对于我们来说并不陌生,从JAVASE部分,我们就在使用System.out.print来打印日志了.通过打印日志来发现和定位问题,或者根据日志来分析程序的运行过程.在Spring的学习中,也经常根据控制台的日志来分析和定位问题
随着项目的复杂度提升,我们对日志的打印也有了更高的需求,而不仅仅是定位排查问题
比如需要记录一些用户的操作记录,也可能需要使用日志来记录用户的一些喜好,把日志持久化,后续进行数据分析等,但是System.out.print不能很好的满足我们的需求,我们就需要使用一些专门的日志框架
2.日志的用途
1.系统监控
监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值进行报警.比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一
2.数据采集
采集的数据可以作用在很多方面,比如数据统计,推荐排序等
3.日志审计

二.日志使用
SpringBoot项目在启动的时候默认就有日志输出

SpringBoot内置了日志框架Slf4j,我们可以直接在程序中调用Slf4j来输出日志
1.打印日志
打印日志的步骤:
1.在程序中得到日志对象.
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
LoggerFactory.getLogger需要传递一个参数,表示这个日志的名称,这样可以更清晰的知道是哪个类输出的日志,当有问题的时候,可以更方便直观的定位到问题类
注意Logger对象是属于org.slf4j包下的,不要导错包
2.使用日志对象输出要打印的内容.
java
@RestController
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger(){
logger. info("------要输出的日志内容-----"")
return"打印日志";
}
}
2.日志框架

SLF4J不同于其他日志框架,他不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范标准,接口,所有SLF4J并不能独立使用,需要和具体的日志框架配合使用
门面模式
SLF4J门面模式的典型应用(但不仅仅使用了门面模式)
门面模式的定义
门面面试(Facade Pattern) 又称之为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口,其主要特征是定义了一个高层接口,让子系统更容易使用
门面模式主要包含了两种角色:
1.外观角色(Facade):也称门面角色,系统统一对外的统一接口
2,子系统角色(SubSystem):可以同时有一个或者多个SubSystem,每个Substem都是不是一个单独的类,而是一个类的集合,SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)
门面模式的实现:
场景:回家,我们会打开各个屋的灯,离开家的时候,会关闭各个屋的灯
如果有一个总开关,来控制整个屋的灯就会很方便
我们可以使用门面模式来实现


我们可以先设置一个外观角色.让他对外提供开灯关灯的方法,我们在使用的时候直接调用这个client的on和off方法即可
接下来我们设置子系统角色
由于所有的地方的灯都具有一些相同的功能,我们可以把这些相同的功能抽出一个接口




这个时候我们就可以修改外观角色的代码

门面模式的优点:
1.减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端
2.提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可
3.提高了安全性,可以灵活设定访问权限,不在门面对象中开通方法,就无法访问
门面模式是设计模式的一种,设计模式重思想轻代码的实现
SLF4J框架介绍
SLF4J就是其他日志框架的门面,SLF4J可以理解为提供日志服务的统一API接口,并不涉及到具体的日志逻辑实现
不引入日志门面
常用的日志框架有log4J,logback等,如果一个项目已经使用log4j,而你依赖的另一个类库,假如是Apache Active MQ,他依赖于另一个日志框架,那么你就需要把logback也加载进去

存在问题:
1.不同日志框架的API接口和配置文件不同,如果多个日志框架同时存在,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件)
2.如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突
3.如果引入的第三方框架,使用了多套,那么就不得不维护多套配置
引入日志门面
引入日志门面框架之后,应用程序和日志框架之间有了统一的API接口,此时应用程序只需维护一套日志文件配置,且当底层实现框架改变的时候,也不许啊哟更改应用程序代码

日志级别
日志的级别从高到低依次为:FATAL,ERROR,WARN,INFO,DEBUG,TRACE
FATAL:致命信息,表示需要立即被处理的系统级错误
ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行
WARN:警告信息,不影响使用,但需要注意的问题
INFO:普通信息,用于记录应用程序正常运行的一些信息,例如系统启动完成,请求处理完成等
DEBUG:调试信息,需要调试的时候的关键信息打印
TRACE:追踪信息,比debug更细粒度的信息事件
默认低于info不打印
日志配置
1.配置日志级别
日志级别配置只需要在配置文件中设置"logging.level"配置项即可,如下所示:
logging.level.root=debug
2.日志持久化
我们之前见的日志都是在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题,把日志保存下来叫持久化
日志持久化有两种方式:
1.配置日志文件名
logging.file.name=logger/springboot.log
2.配置日志的存储目录
logging.file.path=D:/temp
如果这两个配置同时存在,以logging.file.name为主
3.日志文件分割
如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割
|--------------------------------------------------|------------------|----------------------------------|
| 配置项 | 说明 | 默认值 |
| logging.logback.rollingpolicy.fil e-name-pattern | 日志分割后的文件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
| logging.logback.rollingpolicy.m ax-file-size | 日志文件超过这个大 小就自动分割 | 10MB |
4.日志格式配置
|-------------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 配置项 | 说明 | 默认值 |
| Logging.pattern.console | 控制台日志格式 | %clr(%d{{LOG_DATEFORMAT_PATTERN :- yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint}%clr({LOG_LEVEL_PATTERN :-%5p}) %clr({PID :- }){magenta} %clr( --- ){faint} %clr(\[%15.15t\]) {faint} %clr(%-40.40logger{39}){cyan}%clr(:){faint} %m%n{LOG_EXCEPTION_CONVERSION_WORD :- %wEx} |
| logging.pattern.file | 日志文件的日志格式 | %d{{LOG_DATEFORMAT_PATTERN :- yyyy-MM- dd'T'HH:mm:ss.SSSXXX}} {LOG_LEVEL_PATTERN :- %5p} {PID :- } --- \[%t\] %-40.40logger(39}: %m%n{LOG_EXCEPTION_CONVERSION_WORD :- %wEx} |
配置项说明
1.%clr(表达式){颜色} 设置输入日志的颜色
- %d{${LOG_DATEFORMAT_PATTERN :- yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间 -- 精确到毫 秒
3.%5p显示日志级别ERROR,MARN,INFO,DEBUG,TRACE
三.更简单的日志输出
每次使用LoggerFactory.getLogger(xx.class)很繁琐,且每个类都添加一遍,很麻烦,lombok给我们提供了一种更加简单的方式
1.添加lombok框架支持
2,使用@slf4j注解输出日志