一.日志的用途
平时我们使用日志,就是通过控制台打印一些信息,或者程序运行保存,查看控制台报错原因.
随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.
⽐如需要记录⼀些⽤⼾的操作记录 (⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好, 把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print 不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架来实现这些功能.
1.系统监控:
通过日志记录系统的运行状态.
每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警.
2.数据采集:
数据采集是一个很大的范围,可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.
数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略.
推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.
3.日志审计
随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全 越来越受到⼤家的关注,系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患.
二.日志的使用
springboot项目在启动的时候,就有日志打印,这些日志和代码中通过System.out.print打印的日志有什么不同呢?

可以看到启动时打印的日志记录了很多信息,而自己通过System.out.print打印的日志就非常简单了.
springBoot内置了日志框架 slf4j.
我们自己通过代码可以调用slf4j来输出日志.
打印日志步骤:
1.获取日志对象,
获取日志对象时,要通过日志工厂来创建,注意要导入org.slf4j包,不要导错.

LoggerFactory.getLogger()要传递一个参数,用来标识这个类的名称,代表哪个类打印的日志,可以更方便定位到问题.
2.使用日志对象打印日志
java
package com.springlogger.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/logger")
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/get")
public String getLogger(){
//日志对象的打印方式有很多种,这里先用info()方法打印
logger.info("日志信息");
System.out.println("控制台信息");
return "success";
}
}
访问一下浏览器,让方法被执行,就能看到控制台的日志信息了.

三.日志框架的介绍
slf4j包 并不是实现了日志框架,而是一个接口,通过一些类实现了日志框架.

slf4j 是⼀个抽象层, 对⽇志框架制定的⼀种规范, 标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤
日志的实现有: log4j1.log4j2,JUL,logback.
springboot 的日志是由logback框架实现的.
四.门面模式
slf4j就是门面模式的典型用例.
门面模式:(Facade Pattern)⼜称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口. 就是定义了一个高层级别的接口,让子系统使用更方便.

门面模式主要包含两种角色:
1.门面角色:(Facade)也称外观角色,系统对外的统一接口.
2.子系统角色:(SubSystem) 可以同时有一个或多个子系统角色,子系统角色不是一个类,而是一个类的集合.子系统角色并不知道门面角色的存在,对子系统来说,外观角色只是一个客户端.
未引入日志门面时存在的问题:
1.不同的日志框架的API和配置文件是不相同的,当多套日志框架同时存在,就要维护多套日志框架的配置文件(指用户自定义的配置文件).
2.当要更换日志框架时,要修改代码,修改时可能会产生代码冲突.
**3.**如果引⼊的第三⽅框架,使⽤了多套,那就不得不维护多套配置

++门面模式的优点:++
1.减少了系统的依赖
降低了客户端和子系统的耦合度,使得子系统修改时,不会影响到调用它的客户端.
2.提高了灵活性
降低了客户端使用子系统的难度.只需要调用接口就行了,不用关心子系统的内部实现.
3.**提高了安全性,**可以带门面模式中灵活设置访问权限.
引入日志框架后,相当于应用程序和日志实现之间就有了统一的API接口,此时的应用程序只需要维护一台日志文件配置就可以了.SLF4J 就是其他⽇志框架( log4j1.log4j2,JUL,logback)的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志实现.
SLF4J使你的代码独⽴于任意⼀个特定的⽇志API.
五.日志格式
打印出来的日志包含了很多内容.每一段都代表不同的内容.

1.具体元素如下:
1.: 打印日志时的 时间日期,精确到毫秒.
2.: 日志级别 :FATAL,ERROR,WARN,INFO,DEBUG,TRACE依次降低, 日志级别越高,出现的次数越少.
3.: 进程ID.
4.: 配置文件名称.
5.: 线程名.
6.: 打印日志的类路径(存在简写)
7.: 日志内容.
2.日志级别:
日志级别代表着日志信息对应问题的严重性.以便更快地筛选出符合目标的日志信息.
日志级别的分类:
从高到低依次为:FATAL,ERROR,WARN,INFO,DEBUG,TARCE
FATAL: 致命信息.表示需要立即被处理的系统错误.
ERROR:错误信息,较为严重的错误,但不影响系统的继续运行.
WARN:警告信息,不影响使用,但需要注意的问题.
INFO: 普通信息,用于记录一些程序正常运行时的信息,例如系统启动完成、请求处理完成等.
DEBUG:调试信息,需要调试的时候,关键信息的打印.
TARCE:追踪信息,⽐DEBUG更细粒度的信息事件
日志级别的调试人员的bug级别没有关系.

级别越高,收到的消息就越少.
3.日志级别的使用:
日志级别是开发人员自己定义的,根据自己的理解来判断信息的重要程度.
根据这些级别,日志对象分别提供的不同的方法,输出日志:
java
package com.springlogger.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/logger")
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/get")
public String getLogger(){
logger.trace("trace信息");
logger.debug("debug信息");
logger.info("info信息");
logger.warn("warn信息");
logger.error("error信息");
// springboot内置的日志框架地logback,logback没有fatal级别,将其映射到了error级别中.
// logger.fatal("fatal信息");
System.out.println("控制台信息");
return "success";
}
}
fatal级别是顶级错误,出现该类日志时,就不是打印在控制台了.要通过更快,更直接的方法通知到开发人员紧急处理.

查看控制台中的日志,发现,只打印了info级别以上的信息,而info级别一下的信息没有被打印出来.
这与日志级别的配置有关,日志的默认配置为info,就会只打印info级别以上的信息,info是最低打印级别.
4.日志配置
1>.配置日志级别:
⽇志级别配置只需要在配置⽂件中设置**"logging.level**"配置项即可.
.properties配置:

.yml配置:

当.properties文件和 .yml文件同时存在时,两个文件是都生效的,但若出现冲突时, .properties文件的优先级更高.
设置日志级别为trace后,再次运行程序,查看日志:所有的日志级别都被打印了出来:

2>.日志文件持久化
当日志仅输出在控制台中,再次启动程序后,日志就不存在了,我们需要把⽇志保存下来,以便出现问题之后追 溯问题.把⽇志保存下来就叫持久化.
日志持久化的两种方法:
1.配置日志文件名:

配置日志的文件名为:spring.log,在logger文件夹中,可以使用相对路径,也可以使用绝对路径.

启动程序,就可以看到左边窗槛中有一个logger文件夹,里面有一个spring.log文件.

2.配置日志的存储目录:


在D盘中查看:

这种方式只能配置存储路径,存储日志的文件名固定为:spring.log .
当两种方式同时存在时,只有一种生效 ,以配置文件名 (logging.file.name) 为准.
配置日志文件分割:
随着项目的运行,日志文件会越来越多,都放在一个文件中不方便管理,就需要对日志文件进行分割.

对文件超过1KB的文件进行分割,分割的文件名为: 文件名 +日期+索引.

多打印一些日志,查看logger文件夹.

3>.配置日志格式

%clr:(表达式{颜色}): 设置输入日志的格式.

分别是对控制台中日志的不同内容进行的设置.
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'T'HH:mm:ss.SSSXXX}}){faint}: 时间日期的设置.
%5p: 日志级别
%t: 线程名
%5: 字符长度小于5,右遍用空格填充, %-5: 若字符⻓度⼩于5,则左边⽤空格填充.
