ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring: 日志

Spring: 日志

一.为什么要学习日志

⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤System.out.print来打印⽇志了. 通过打
印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程. 在Spring的学习中, 也经常根据控制台的⽇志来分析和定位问题.随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好,把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做).

二.日志的用途

通过前⾯的学习, 我们知道⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途
1.系统监控
监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀
2.数据采集
数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.
•数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略
•推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.下图中的数据源, 其中⼀部分就来⾃于⽇志记录的数据.
3.日志审计
随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全越来越受到⼤家的关注, 系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患.

三.日志使用

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所⽰:
它打印的⽇志和System.out.print有什么不同呢
观察⽇志输出
可以看到, 我们通过System.out.print打印的⽇志, ⽐SpringBoot打印的⽇志缺少了很多信息.

四.打印日志

打印⽇志的步骤:
•在程序中得到⽇志对象.
•使⽤⽇志对象输出要打印的内容.
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所⽰:
private staticLogger logger= LoggerFactory.getLogger(LoggerController.class);
LoggerFactory.getLogger 需要传递⼀个参数, 标识这个⽇志的名称. 这样可以更清晰的知道是哪个类输出的⽇志. 当有问题时, 可以更⽅便直观的定位到问题类
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所⽰:
1importorg.slf4j.Logger;
2importorg.slf4j.LoggerFactory;
3importorg.springframework.web.bind.annotation.RequestMapping;
4importorg.springframework.web.bind.annotation.RestController;
5
6@RestController
7public classLoggerController{
8private staticLogger logger= LoggerFactory.getLogger(LoggerController.class);
9
10@RequestMapping("/logger")
11publicStringlogger(){
12logger.info("--------------要输出⽇志的内容----------------");
13return"打印⽇志";
14}
15
16}
打印⽇志效果展⽰:

五.⽇志框架介绍

SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范,标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤
1.⻔⾯模式(外观模式)
⻔⾯模式定义:
⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.
⻔⾯模式主要包含2种⻆⾊:
外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝.
⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,⽽是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)
⻔⾯模式的优点
•减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客⼾端;
•提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需要和⻔⾯对象交互即可.
•提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问

六.⽇志格式的说明

从上图可以看到,⽇志输出内容元素具体如下:
1.时间⽇期:精确到毫秒
2.⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
3.进程ID
4.线程名
5.Logger名(通常使⽤源代码的类名)
6.⽇志内容

七.⽇志级别

⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息.有了⽇志级别之后就可以过滤⾃⼰想看到的信息了, ⽐如只关注error级别的, 就可以根据级别过滤出来error级别的⽇志信息, 节约开发者的信息筛选时间.
1.⽇志级别的分类
⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
•FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.
•ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.
•WARN: 警告信息, 不影响使⽤, 但需要注意的问题
•INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.
•DEBUG: 调试信息, 需要调试时候的关键信息打印.
•TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
2.⽇志级别的使⽤
⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度
针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志.
/**
2* 打印不同级别的⽇志
3*@return
4*/
5@RequestMapping("/printLog")
6publicStringprintLog() {
7logger.trace("================= trace ===============");
8logger.debug("================= debug ===============");
9logger.info("================= info ===============");
10logger.warn("================= warn ===============");
11logger.error("================= error ===============");
12
13return"打印不同级别的⽇志";
14}
观察打印的⽇志结果:
结果发现, 只打印了info, warn和error级别的⽇志
这与⽇志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就是info, warn和error

八.⽇志配置

⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所示:
Properties配置logging.level.root=debug

yml配置logging:level:root:debug

1.⽇志持久化
以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化
⽇志持久化有两种⽅式 配置⽇志⽂件名/配置⽇志的存储⽬录
配置⽇志⽂件的路径和⽂件名:
Properties配置logging.file.name=logger/springboot.log
yml配置logging: file: name:logger/springboot.log
配置⽇志⽂件的保存路径:
Properties配置logging.file.path=D:/temp
yml配置logging: file: name:D:/temp

九.总结

⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot 内容了⽇志框
架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的
@Slf4j注解和log对象快速的打印⾃定义⽇志
⽇志包含 6 个级别, ⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称
或保存⽬录来将⽇志持久化.
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进