【JavaEE进阶】Spring Boot日志

[复制链接]
发表于 2025-10-30 21:26:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
🌴日志日志概述
🚩为什么要学习日志日志
🚩日志日志的用途
🚩日志使用
🌳打印日志
🚩在步调中得到日志对象
🚩使用日志对象打印日志
🌲日志框架先容(Slf4j )
🚩门面模式
🏀门面模式的界说
🏀门面模式的优点
🚩关于SLF4J框架
🏀不引入日志门面
🏀引入日志门面
🍃日志格式阐明
🎄日志级别
🚩日志级别的分类
🚩日志级别的使用
🍀日志设置
🚩设置日志级别
🚩日志恒久化
🚩设置日志文件分割
🚩设置日志格式
🎍更简朴的日志输出

🌴日志概述

🚩为什么要学习日志

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

通过前⾯的学习,我们知道⽇志紧张是为了发现题目,分析题目,定位题目的,但除此之外,⽇志另有许多 ⽤途
1. 体系监控监控
监控监控如今⼏乎是⼀个成熟体系的标配, 我们可以通过⽇志记录这个体系的运⾏状态,每⼀个⽅法的相应 时间,相应状态等,对数据进⾏分析,设置差别的规则,凌驾阈值时进⾏报警.⽐如统计⽇志中关键字的数 量,并在关键字数目到达⼀定条件时报警,这也是⽇志的常⻅需求之⼀
2. 数据收罗
数据收罗是⼀个⽐较⼤的范围,收罗的数据可以作⽤在许多⽅⾯,⽐如数据统计,保举排序等
数据统计:统计⻚⾯的欣赏量(PV),访客量(UV),点击量等,根据这些数据进⾏数据分析,优化公司运营 战略
保举排序: ⽬前保举排序应⽤在各个范畴,我们常常打仗的各⾏各业许多也都涉及保举排序,⽐如购 物,⼴告,消息等范畴.数据收罗是保举排序⼯作中必须做的⼀环,体系通过⽇志记录⽤⼾的欣赏历 史,停顿时⻓等,算法⼈员通太过析这些数据,训练模子,给⽤⼾做保举
下图中的数据源,此中⼀部门就来⾃于⽇志记录的数据

3. ⽇志审计
随着互联⽹的发展,浩繁企业的关键业务越来越多的运⾏于⽹络之上.⽹络安全越来越受到⼤家的关 注,体系安全也成为了项⽬中的⼀个紧张环节, 安全审计也是体系中⾮常紧张的部门.国家的政策法规、 ⾏业尺度等都明白对⽇志审计提出了要求.通过体系⽇志分析,可以判断⼀些⾮法攻击,⾮法调⽤,以 及体系处置惩罚过程中的安全隐患
⽐如,⼤家寻常都在做运营体系,此中运营⼈员在通过界⾯处置惩罚⼀些数据的时间,如果没有清晰的⽇志 使用记录,⼀条数据被删除大概修改,你是⽆法找到是谁使用的,但是如果你做了相应的记录,该数 据被谁删除大概修改就会⼀⽬了然
另有⼀些内部的违规和信息走漏(⽐如客⼾信息被卖掉)征象出现后, 如果未记录留存⽇志,为事后观察 提供依据,则事后很难追查(⼀些公司查察客⼾的信息都会被记录⽇志,如果频仍查询也会报警)
🚩日志使用

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

它打印的⽇志和 System.out.print 有什么差别呢

可以看到,我们通过 System.out.print 打印的⽇志, 比SpringBoot打印的⽇志缺少了许多信息
SpringBoot 内置了⽇志框架 SpringBoot Slf4j ,我们可以直接在步调中调⽤ Slf4j 来输出⽇志
🌳打印日志

打印⽇志的步调:


  • 在步调中得到⽇志对象.
  • 使⽤⽇志对象输出要打印的内容.
🚩在步调中得到日志对象

在步调中获取⽇志对象须要使⽤⽇志⼯⼚LoggerFactory,如下代码所⽰:

LoggerFactory.getLogger 须要转达⼀个参数,标识这个⽇志的名称.如许可以更清晰的知道是哪个类 输出的⽇志.当有题目时,可以更⽅便直观的定位到题目类

注意:Logger对象是属于org.slf4j包下的,不要导⼊错包
🚩使用日志对象打印日志

代码:

打印日志效果展示:

🌲日志框架先容(Slf4j )


SLF4J差别于其他⽇志框架,它不是⼀个真正的⽇志实现,⽽是⼀个抽象层,对⽇志框架订定的⼀种规范、尺度、接⼝.全部SLF4J并不能独⽴使⽤,须要和详细的⽇志框架共同使⽤
🚩门面模式

SLF4J是⻔⾯模式的范例应⽤(但不光仅使⽤了⻔⾯模式).
🏀门面模式的界说

⻔⾯模式(Facade Pattern)⼜称为表面模式,提供了⼀个统⼀的接⼝,⽤来访问⼦体系中的⼀群接⼝.
其紧张特性是界说了⼀个⾼层接⼝,让⼦体系更容易使用。
   原⽂:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higherlevel interface that makes the subsystem easier to use.
表明:要求⼀个⼦体系的外部与其内部的通讯必须通过⼀个统⼀的对象进⾏.⻔⾯模式提供⼀个⾼条理的接⼝,使得⼦体系更易于使⽤
  


⻔⾯模式紧张包罗2种⻆⾊:


  • 表面⻆⾊(Facade):也称⻔⾯⻆⾊,体系对外的统⼀接⼝.
  • ⼦体系⻆⾊(SubSystem):可以同时有⼀个或多个SubSystem.每个SubSytem都不是⼀个单独的类,⽽是⼀个类的聚集.SubSystem并不知道Facade的存在,对于SubSystem⽽⾔,Facade只是另⼀个客⼾端⽽已(即Facade对SubSystem透明)
   ⽐如去医院看病,大概要去挂号,⻔诊,化验,取药,让患者或患者眷属以为很复杂,如果有提供欢迎⼈员,只让欢迎⼈员来处置惩罚,就很⽅便

  🏀门面模式的优点



  • 镌汰了体系的相互依赖.实现了客⼾端与⼦体系的耦合关系,这使得⼦体系的厘革不会影响到调⽤它的客⼾端;
  • 提⾼了机动性,简化了客⼾端对⼦体系的使⽤难度,客⼾端⽆需关⼼⼦体系的详细实现⽅式,⽽只须要和⻔⾯对象交互即可.
  • 提⾼了安全性.可以机动设定访问权限,不在⻔⾯对象中开通⽅法,就⽆法访问
🚩关于SLF4J框架

SLF4J就是其他⽇志框架的⻔⾯.SLF4J可以明白为是提供⽇志服务的统⼀API接⼝,并不涉及到详细的⽇志逻辑实现
那么为什么要引入日志门面呢?我们来看一下引入与不引入的区别就知道了
🏀不引入日志门面

常⻅的⽇志框架有log4J,logback等.如果⼀个项⽬已经使⽤了log4j,⽽你依赖的另⼀个类库,如果是Apache Active MQ,它依赖于别的⼀个⽇志框架logback,那么你就须要把logback也加载进去

存在题目:

  • 差别⽇志框架的API接⼝和设置⽂件差别,如果多个⽇志框架共存,那么不得不维护多套设置⽂件(这个设置⽂件是指⽤⼾⾃界说的设置⽂件).
  • 如果要更换⽇志框架,应⽤步调将不得不修改代码,而且修改过程中大概会存在⼀些代码辩说.
  • 如果引⼊的第三⽅框架,使⽤了多套,那就不得不维护多套设置
🏀引入日志门面

引⼊⻔⾯⽇志框架之后,应⽤步调和⽇志框架(框架的详细实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现),此时应⽤步调只须要维护⼀套⽇志⽂件设置,且当底层实现框架改变时,也不须要更改应⽤步调代码.

SLF4J就是这个⽇志⻔⾯.
总的来说,SLF4J使你的代码独⽴于恣意⼀个特定的⽇志API,实现解耦。这是⼀个对于开发API的开发者很好的头脑.
🍃日志格式阐明

⽇志输出内容元素详细如下:

  • 时间⽇期:精确到毫秒
  • ⽇志级别:ERROR,WARN, INFO,DEBUG或TRACE
  • 进程ID
  • 线程名
  • Logger名(通常使⽤源代码的类名)
  • ⽇志内容
🎄日志级别

⽇志级别代表着⽇志信息对应题目的严肃性,为了更快的筛选符合⽬标的⽇志信息
试想⼀下如许的场景,假设你是⼀家2万⼈公司的⽼板,如果每个员⼯的⽇常⼯作和噜苏的信息都要反 馈给你,那你⼀定⽆暇顾及.于是就有了构造架构,⽽构造架构就会分级,有许多的级别设置,如下图 所⽰:

有了构造架构之后,就可以逐级别报告消息了,比方:组员报告给组⻓,组⻓报告给研发⼀组,研发⼀组 报告给Java研发,等等依次进⾏报告.
⽇志级别⼤概是同样的原理,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如只关注error级别 的,就可以根据级别过滤出来error级别的⽇志信息,节省开发者的信息筛选时间
🚩日志级别的分类

日志的级别从⾼到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE


  • FATAL:致命信息,表⽰须要⽴即被处置惩罚的体系级错误
  • ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响体系的继续运⾏.
  • WARN:告诫信息,不影响使⽤,但须要注意的题目
  • INFO:寻常信息,⽤于记录应⽤步调正常运⾏时的⼀些信息,比方体系启动完成、哀求处置惩罚完成等
  • DEBUG:调试信息,须要调试时间的关键信息打印
  • TRACE:追踪信息,⽐DEBUG更细粒度的信息事故(除⾮有特殊⽤意,否则请使⽤DEBUG级别替换)
⽇志级别通常和测试⼈员的Bug级别没有关系.
⽇志级别是开发⼈员设置的,⽤来给开发⼈员看的.⽇志级别的精确设置,也与开发⼈员的⼯作履历有 关.如果开发⼈员把error级别的⽇志设置成了info,就很有大概会影响开发⼈员对项⽬运⾏环境的判 断.出现error级别的⽇志信息较多时,大概也没有任何题目. 测试的bug级别更多是依据征象和影响范 围来判断
日志级别的次序:

级别越⾼,收到的消息越少
🚩日志级别的使用

⽇志级别是开发⼈员⾃⼰设置的.开发⼈员根据⾃⼰的明白来判断该信息的紧张水平
类似公司管理,通常由向导来判断什么样的事变须要报告,什么样的事变不须要报告
针对这些级别,Logger对象分别提供了对应的⽅法,来输出⽇志
代码:
SpringBoot 默认的⽇志框架是Logback,Logback没有 FATAL 级别,它被映射到 ERROR
出现fatal⽇志,表⽰服务已经出现了某种水平的不可⽤,须要须要体系管理员告急介⼊处置惩罚.通常情 况下,⼀个进程⽣命周期中应该最多只有⼀次FATAL记录
观察打印的⽇志效果:

效果发现,只打印了info,warn和error级别的⽇志
这与⽇志级别的设置有关, ⽇志的输出级别默认是info级别,以是只会打印⼤于即是此级别的⽇志,也就 是info, warn和error
🍀日志设置

上述是⽇志的使⽤,⽇志框架⽀持我们更机动的输出⽇志,包罗内容,格式等
🚩设置日志级别

⽇志级别设置只须要在设置⽂件中设置"logging.level"设置项即可,如下所⽰:
后⾯课程中出现的设置,properties和yml只须要设置此中⼀个即可.
⼆者转换⽅式roperties⽂件的点( . )对应yml⽂件中的换⾏
以下两个设置,根据项⽬使⽤此中之⼀
Properties设置:

yml设置:

当前使用的yml设置:

再次举行打印,看一看效果:

🚩日志恒久化

以上的⽇志都是输出在控制台上的,然⽽在线上环境中,我们须要把⽇志生存下来,以便出现题目之后追溯题目.把⽇志生存下来就叫恒久化.⽇志恒久化有两种⽅式

  • 设置⽇志⽂件名
  • 设置⽇志的存储⽬录

设置文件文件名如下:

启动项目:此时就会在项目路径下天生日志文件

后⾯可以跟绝对路径大概相对路径

启动项目:此时就会在项目路径下创建一个logger文件

设置文件的储存目次如下:

启动项目观察该文件路径:而且重新启动项目之后,新天生的日志会追加到上一个日志背面

使用该设置,会在该目次下创建一个默认的spring.log的文件储存日志
注意:


  • logging.file.name 和 logging.file.path 两个都设置的环境下,只⽣效其⼀,以logging.file.name 为准
🚩设置日志文件分割

如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,须要对⽇志⽂件进⾏分割.
固然,⽇志框架也帮我们思量到了这⼀点,以是如果不进⾏设置,就⾛⾃动设置。默认⽇志⽂件凌驾10M就进⾏分割x

yml设置如下:

分割效果如下:

🚩设置日志格式

⽬前⽇志打印的格式是默认的

打印⽇志的格式,也是⽀持设置的.⽀持控制台和⽇志⽂件分别设置

设置项阐明:


  • 1. %clr(表达式){颜⾊}设置输⼊⽇志的颜⾊
支持颜色有以下几种:• blue • cyan • faint • green • magenta • red • yellow


  • 2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ⽇期和时间--精确到毫 秒
   %d{}
  ⽇期 ${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX} ⾮空表达式,获取 体系属性 LOG_DATEFORMAT_PATTERN ,若属性 ⽤- LOG_DATEFORMAT_PATTERN 不存在,则使 yyyy-MM-dd HH:mm:ss.SSSXXX 格式,体系属性可以 System.getProperty("LOG_DATEFORMAT_PATTERN") 获取
  

  • 3. %5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE
  • 4. %t 线程名. %c 类的全限定名. %M method. %L 为⾏号.%thread 线程名称. %m 大概 %msg 显⽰输出消息. %n 换⾏符
  • 5. %5 若字符⻓度⼩于5,则右边⽤空格添补. %-5 若字符⻓度⼩于5,则左边⽤空格添补. %.15 若字符⻓度凌驾15,截去多余字符.%15.15 若字符⻓度⼩于15,则右边⽤空格添补.若字符⻓度凌驾15,截去多余字符
更多阐明,参考:Chapter 6: Layouts
如果设置了颜色没有体现怎么办呢?
办理方法如下:


  • 1.打开启动设置

  • 2.添加VM options

  • 3.添加VM options -Dspring.output.ansi.enabled=ALWAYS

  • 4.重新启动步调,就发现控制台⽀持颜⾊了

🎍更简朴的日志输出

每次都使⽤LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加⼀遍,lombok给我们提供了⼀种更简朴的⽅式.

  • 添加lombok框架⽀持
  • 使⽤ @slf4j 注解输出⽇志
lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象log,我们直接使⽤就可以
实今世码如下:


总结:

  • ⽇志是步调中的紧张构成部门,使⽤⽇志可以快速的发现和定位题目,Spring Boot内容了⽇志框架,默认环境下使⽤的是info⽇志级别将⽇志输出到控制台的,我们可以通过lombok提供的@Slf4j 注解和 log 对象快速的打印⾃界说⽇志.
  • ⽇志包罗6个级别,⽇志级别越⾼,收到的⽇志信息也就越少,我们可以通过设置⽇志的生存名称或生存⽬录来将⽇志恒久化
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表