Spring Boot日志
1. 日志的概述
1.1 概念:
最早期我们就通过System.out.print来打印日志,用来发现和定位问题.随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.比如如需要记录⼀些⽤户的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录用户的⼀些喜好, 把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print 不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做)
1.2 日志的用处
1> 发现问题, 分析问题, 定位问题是最基本功能
2> 系统监控,举个例子某个接口的运行时间是多少,然后客户访问后端使用这个接口100次,只有10次响应,那么可用率就为10%,需要进行优化.再比如,我如果在异常里面打印日志,发现异常的次数在一段时间内超过了阈值,就进行报警.
监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. 比如如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之一
我们下面是使用日志测试一个get接口使用到结束的耗费时间
3> 数据采集
比如: 在购物网站,我们要知道今天卖了多少货物,收了多少钱,最畅销的商品是哪些....
网站一般分为日活,月活...用活(用户一登陆,前端就把登录信息打印出来了,我们就能根据这个来进行统计) ,还能计算某个用户今天在哪个商品停留了多少时间.
数据采集是⼀个比较大的范围, 采集的数据可以作⽤在很多⽅⾯, 比如数据统计, 推荐排序等.
数据统计: 统计页面的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略
推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, 比如购物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录用户的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给用户做推荐.
数据清洗(日志清洗,数据治理): 分析日志...
4> ⽇志审计
大多都是国家需要,比如网络安全这一块.很多软件在使用之前都要获取我们的信息,进行一些授权,这样我们的一些信息就流在网络上了.
随着互联网的发展,众多企业的关键业务越来越多的运⾏于网络之上. 网络安全越来越受到⼤家的关注, 系统安全也成为了项目中的⼀个重要环节, 安全审计也是系统中非常重要的部分. 国家的政策法规、⾏业标准等都明确对日志审计提出了要求. 通过系统⽇志分析,可以判断⼀些非法攻击, 非法调用,以及系统处理过程中的安全隐患.
比如, 大家平时都在做运营系统, 其中运营⼈员在通过界⾯处理⼀些数据的时候, 如果没有清楚的⽇志操作记录, ⼀条数据被删除或者修改, 你是⽆法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会⼀目了然.还有⼀些内部的违规和信息泄漏(⽐如客户信息被卖掉)现象出现后, 如果未记录留存⽇志, 为事后调查提供依据, 则事后很难追查(⼀些公司查看客⼾的信息都会被记录⽇志, 如果频繁查询也会报警).
2. 日志的使用
Spring里面集成了日志框架,我们来进行使用
2.1 使用日志对象打印日志
创建日志对象,然后打印日志
运行结果:
解释代码:
LoggerFactory.getLogger()里面的内容是什么?logger.info()里面的内容是什么?
2.2 日志框架介绍
设计模式
设计模式就是对方法的封装.
工厂模式概述
此时,这里就使用了一种工厂模式(线程池那里也用到了工厂模式)
门面模式(外观模式)
提供了一个统一的接口,用来访问子系统中的一群接口.其主要特征是定义了一个高层接口,让用户更容易使用.
门面系统的角色:
1> 外观角色: 也叫做门面角色,是系统对外的统一接口
2> 子系统角色: 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,而言是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem而言, Facade 只是另⼀个客户端而已(即 Facade 对 SubSystem 透明)
比如刚刚的那个图:对于子系统而言,门面系统只是一个客户端而已.通过门面系统来调用子系统会更加的方便.
比如看病这个例子:去医院看病,,可能要去挂号, ⻔诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待⼈员, 只让接待⼈员来处理, 就很⽅便.
门面模式的实现:
场景: 回家, 我们会开各个屋的灯. 离开家时, 会关闭各个屋的灯.如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便.我们使⽤⻔⾯模式的实现.
1> 实现子系统
2> 实现门面系统
我们在门面系统里面调用子系统,把分别的子系统的功能封装到一起来进行统一使用.
它是一种规范,只有类实现开灯和关灯俩个功能,才能作为它的子系统.
3> 客户端调用门面系统
门面模式的优缺点(八股文)
1. 减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端(只要修改门面系统即可)
2. 提高了灵活性,简化了客户端对子系统的使用难度,客户端不需要关系子系统的具体实现,只需要使用门面系统封装好的接口就行.
3. 提高了安全性,可以灵活设置访问权限,不在门面对象中开通方法就无法访问.因为有了门面系统,我们的客户端就不能够直接接触到子系统了,这就提高了安全性.
什么是日志实现?
Spring 打印日志使用的是JUL( Java util Logging),默认的日志框架是logback.
他们是底层的日志框架
什么是日志门面?
slf4j是日志的门面,它是门面模式的典型应用,是对日志实现的进一步封装.不需要关注它具体实现是什么,直接使用接口就行.
slf4j是一种规范,
3. SLF4J框架介绍
SLF4J 就是其他⽇志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志逻辑实现.
3.1 不引入日志门面
常见的⽇志框架有log4J, logback等. 如果⼀个项⽬已经使⽤了log4j,⽽你依赖的另⼀个类库,假如是Apache Active MQ, 它依赖于另外⼀个⽇志框架logback, 那么你就需要把logback也加载进去.
存在问题:
1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指⽤⼾⾃定义的配置⽂件).
2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.
3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置(还牵扯到版本问题).
3.2 引入日志门面
引⼊⻔⾯⽇志框架之后, 应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代码.配置相同,我们只需要维护一个版本就行.
3.3 日志格式的介绍
我们可以看到有一下日志内容
1> 时间⽇期:精确到毫秒
2> ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE
3> 进程ID
4> 线程名
5> Logger名(通常使⽤源代码的类名)
6> ⽇志内容
3.3.1 日志的级别
日志的级别代表日志信息的严重性.有了⽇志级别之后就可以过滤⾃⼰想看到的信息了, ⽐如只关注error级别的, 就可以根据级别过滤出来error级别的⽇志信息, 节约开发者的信息筛选时间.
例: 试想⼀下这样的场景,假设你是⼀家 2 万⼈公司的⽼板, 如果每个员⼯的⽇常⼯作和琐碎的信息都要反馈给你, 那你⼀定⽆暇顾及. 于是就有了组织架构,⽽组织架构就会分级,有很多的级别设置,如下图所示:
有了组织架构之后,就可以逐级别汇报消息了, 例如:组员汇报给组⻓, 组⻓汇报给研发⼀组, 研发⼀组汇报给 Java 研发, 等等依次进⾏汇报.
日志级别划分:
日志级别从高到低: FATAL,ERROR,WARN,INFO,DEBUG,TRACE
1> FATAL: 致命信息,表示需要立即被处理的系统错误.
2> ERROR: 错误信息,级别较高的错误日志信息,但是不影响系统的继续运行.(比如我们验证码,校验信息失败,或者偶尔一次的超时)
3> WARN: 警告信息,不影响使用,但需要注意.(长期不处理,可能会引起故障)
4> INFO: 普通信息,用来记录应用正常运行时的一些信息,例如系统启动完成,请求处理完成...
5> DEBUG: 调试信息,需要调试的关键信息打印
6> TRACE: 追踪信息,比DEBUG颗粒度更细的信息事件(很少使用)
日志级别顺序
使用日志级别:
trace,debug日志信息一般不打印,但是我们可以设置打印出来.>=info级别的日志,我都可以收到
注意: 错误级别的日志,和测试人员提出的bug级别无关.这个错误级别是方便程序员来看的.
设置日志级别:
我们去官方文档看一下 :常见的 Application Properties
日志级别只要在配置文件中设置"logging.level"配置即可,后面我们只要在yml或者Properties里面配置一个就行.⼆者转换⽅式: Properties⽂件的点(. ) 对应yml⽂件中的换⾏以下两个配置, 根据项⽬使⽤其中之⼀.
yml版本:
logging:
level:
root: debug
properties版本:
logging.level.root: debug
这个说明一件事,程序如果运行出来了,一些DEBUG日志是不影响的
基本上企业开发里面,每个项目都有错误日志,不影响结果的运行就可以不管他们
然后我们使用自己刚刚的日志级别: 发现debug级别依然没有打印出来
这个原因就是因为yml我们配置的路径的问题: root表示设置所有的整个目录文件的日志级别
同理,我们也可以去打印trace级别的日志
规律: 打印出来>=我们在配置文件设置的级别,比如我们设置info,那么我们可以打印出来info,warn,err
日志持久化
以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化.
简单来说就是.我们关掉我们的程序之后,我们的日志就没有了,比如我今天才发现了一星期前的一个Bug,那么我就需要一星期前的日志.此时,我们就需要把日志存起来,形成一个文件.
官方文档给出的核心组件: 常见的 Application Properties
第一个组件: logging,file.name
我们来使用一下logging.file.name.这样我们就可以查到我们之前的日志信息了
刚刚我们没有设置路径,此时我们设置路径,我们生成了一个文件夹,然后里面放着我们的历史日志
持久化的问题: 我们一直在历史日志下面继续添加日志,如果太大了(一般,我们要存一个月的日志),我们该如何解决.解决这个问题,我们就可以用到多个文件夹了,一个文件夹存不下的,我们用多个文件夹进行存(此时就牵扯到日志的分割,后面再说)
第二个组件: logging.file.path
我们进行使用:
此时我们得出一个结论:
name: 可以设置路径和名称
path: 只可以设置路径,默认日志名:spring.log
对比:
如果path和name都进行设置
name生效,path不生效.name的优先级高于path
日志分割
如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割.一般10M就进行分割.
设置分割日志的大小,此时我设置的是1KB
注意: 如果觉得代码没有问题,那么就可以去考虑缓存问题.点击这里面的clean
设置分割日志的格式,此时我们采用默认值
配置日志格式
一些配置项和配置说明
配置控制台里面信息的颜色: 复制这个信息,-配置一下 Dspring.output.ansi.enabled=ALWAYS
注意有些格式可能对不上,我们就去官方寻找答案
官方格式详解:
更加简单的日志输出
这是我们之前的输出日志的方式: 1.声明对象 2. 打印日志
我们lombok提供了一个注解@Slf4j
4. 总结:
1> 日志是用来快速发现和定位问题的工具,Spring Boot 帮我们把logback集成了进来.日志的6个级别.一般常用warrn,info,error.一般日志在工作的时候是单独在一个xml进行配置的.默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的@Slf4j 注解和 log 对象快速的打印⾃定义⽇志.
2> ⽇志包含 6 个级别, ⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化.
原文地址:https://blog.csdn.net/2201_75880772/article/details/145161778
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!