[Spring] Spring日志

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 日志的使用
    • 1.1 打印日志
    • 1.2 日志框架
      • 1.2.1 门面模式(外观模式)
      • 1.2.2 slf4j框架介绍
    • 1.3 日志格式说明
    • 1.4 日志级别
      • 1.4.1 日志级别的分类
      • 1.4.2 日志级别的使用
    • 1.5 日志配置
      • 1.5.1 配置日志级别
      • 1.5.2 日志持久化(把日志存储在硬盘中)
      • 1.5.3 配置日志文件的分割
  • 2. 更简单的日志输出

1. 日志的使用

在SpringBoot项目启动的时候,就会默认有日志输出.
在这里插入图片描述
如果我们使用sout去打印日志,那么日志就不会像Spring默认的这样打印出来,只会打印规定输出的内容,相比这些缺少了很多的信息.
我们为了打印出信息更加齐全的日志,Spring内置了日志的框架,叫做Slf4j ,我们可以直接在程序中调用Slf4j 来输出日志.

1.1 打印日志

打印日志有以下两个步骤:

  1. 在程序中获取到日志对象.
    在程序中获取日志对象的时候,我们需要使用到一个工厂类,叫做LoggerFactory,我们称它为日志工厂.代码如下:
package com.jrj.logger;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);
}

需要注意的是,在输入Logger这个类之后,编译器会有很多的提示,一定要选择slf4j这个包下的一个接口,不要选错了.还有,工厂类后面方法中的参数传入的是一个类对象,这个括号中传入的是哪个类的类对象,就表示哪个类在打印日志.

  1. 使用日志对象输出要打印的内容.
    使用日志对象打印的方式有好多种.我们先通过logger对象调用info方法来输出日志:
@RestController
public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);@PostConstructpublic static String printLogger(){logger.info("打印日志");return "打印日志";}
}

运行结果:
在这里插入图片描述

1.2 日志框架

在这里插入图片描述
日志其实并不是由slf4j自己实现的,它只是⼀个抽象层,对日志框架制定的⼀种规范,标准,接口.真正实现日志的其实是底层的logback,所以slf4j不可以单独使用,需要搭配具体的日志框架来使用.

1.2.1 门面模式(外观模式)

在slf4j中使用了一种典型的设计模式,叫做门面模式.
门面模式又称为外观模式,提供了⼀个统⼀的接口,用来访问子系统中的⼀群接口.其主要特征是定义了⼀个高层接口,让子系统更容易使用.
在这里插入图片描述

  • 门面模式中主要包含两种角色
  1. 门面角色,是系统对外提供的统一的接口,也叫外观角色.
  2. 子系统角色,可以同时有⼀个或多个SubSystem,每个SubSytem都不是⼀个单独的类,而是⼀个类的集合.

举例说明:去医院看病
病人去医院看病,可能要去挂号,就诊,化验,取药等一系列繁杂的操作,让患者和家属觉得很麻烦,这事如果医院有一个接待人员,就会方便很多.
在这里插入图片描述

  • 实现门面模式
    场景:家里的灯,各个屋子都有各自的开关,可以控制各个屋子的灯,在门口的地方有一个总开关,可以控制所有的灯.一关全关.
public interface ILight {void on();//开灯接口void off();//关灯接口
}
public class LivingroomLight implements ILight{@Overridepublic void on() {System.out.println("打开客厅灯");}@Overridepublic void off() {System.out.println("关闭客厅灯");}
}
public class BedroomLight implements ILight{@Overridepublic void on() {System.out.println("打开卧室灯");}@Overridepublic void off() {System.out.println("关闭卧室灯");}
}
public class FacadeLight implements ILight{public LivingroomLight livingroomLight = new LivingroomLight();public BedroomLight bedroomLight = new BedroomLight();@Overridepublic void on() {livingroomLight.on();bedroomLight.on();}@Overridepublic void off() {livingroomLight.off();bedroomLight.off();}
}

运行结果:
在这里插入图片描述

1.2.2 slf4j框架介绍

SLF4J就是其他日志框架的门面.SLF4J可以理解为是提供日志服务的统⼀API接口,并不涉及到具体的日志逻辑实现.

  • 不引入日志门面
    假如一个项目你已经依赖了log4j日志框架,假如你依赖的另一个类库假如是Apache Active MQ,它依赖的日志框架是logback日志框架,那么你需要把logback也导入进去.
    存在的问题:
  1. 不同日志框架的API接口和配置文件不同,如果多个日志框架共存,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件).
  2. 如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在⼀些代码冲突.
  3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置.
    在这里插入图片描述
  • 引入日志门面
    应用程序和日志框架(框架的具体实现)之间有了统⼀的API接口(门面日志框架实现),此时应用程序只需要维护⼀套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码.
    在这里插入图片描述
    其中我们的slf4j就是一个日志门面,它会把底层的日志框架统一起来,之后使用统一的接口来提供给用户.使你的代码独立于任何一个特定的日志框架API.

1.3 日志格式说明

在这里插入图片描述

  1. 日志打印时间,可以精确到毫秒.
  2. 日志级别,分为ERROR,WARN,INFO,DEBUG或TRACE
  3. 进程ID
  4. 打印日志的项目(项目名称取决于配置文件)
  5. 线程名称.
  6. Logger名
  7. 日志内容.

1.4 日志级别

1.4.1 日志级别的分类

日志级别代表着日志信息对应问题的严重性,为了更快的筛选符合目标的日志信息.
日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE.
• FATAL:致命信息,表示需要立即被处理的系统级错误.
• ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行.
• WARN:警告信息,不影响使用,但需要注意的问题
• INFO:普通信息,用于记录应用程序正常运行时的⼀些信息,例如系统启动完成、请求处理完成等.
• DEBUG:调试信息,需要调试时候的关键信息打印.
• TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)
级别顺序:
在这里插入图片描述

fatal级别的日志,表示服务器出现了某种程度上的不可用,需要程序员紧急介入处理,一般在一个程序的生命周期中fatal级别的日志只会出现一次.

1.4.2 日志级别的使用

打印日志的级别,可由开发人员根据信息的重要程度和自己的理解自己设置日志级别.针对这些不同的日志级别,Logger对象也提供了不同的方法来打印不同级别的日志.

@RestController
public class LoggerDemo {public static Logger logger = LoggerFactory.getLogger(LoggerDemo.class);@PostConstructpublic static String printLogger(){logger.info("打印info日志");logger.error("打印error日志");logger.warn("打印warn日志");logger.debug("打印debug日志");logger.trace("打印trace日志");return "打印日志";}
}

在这几个日志级别中,默认fatal(被映射到了error级别),debug,trace这几个级别的日志不会输出.但是可以通过配置文件修改起始打印级别.
在这里插入图片描述

1.5 日志配置

上述是日志的使用,日志框架支持我们更灵活的输出日志,包括内容,格式等.

1.5.1 配置日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可,如下:(以yml文件格式为例)

logging:level:root: debug

我们看到,debug级别的日志也被打印了出来.
在这里插入图片描述
这里其中的root表示的是该项目下的所有文件的日志,我们也可以通过在level下面加上软件包的树形结构来限定只有规定包下文件的日志从指定级别开始打印.

logging:level:com:jrj:logger: trace

我们看到只有我们刚刚自己写的日志被打印了出来,没有像上面打印的那么多的信息.
在这里插入图片描述

1.5.2 日志持久化(把日志存储在硬盘中)

我们之前的日志都是在控制台上打印日志,这就意味着日志在内存中,如何在硬盘中永久存储日志呢?
日志持久化有两种方式:

  1. 配置日志文件的文件名,文件名中既可以设置路径,又可以设置文件名.
logging:level:com:jrj:logger: tracefile:name: logger/springLogger.log

file下面的几行就是在使用文件名配置日志文件.
在这里插入图片描述
我们看到在项目的目录之下,多出了一个logger的目录,目录中就存储的是指定路径之下的日志.
[注意]

  • 日志在log文件中存储的时候是以追加的形式存储的,当我们再次运行项目的时候,如果不改变配置文件中的文件名,新的日志就会追加在下面.
    在这里插入图片描述
  • 配置文件中如果是同一个配置项在配置文件中不可以出现两次或以上,需要把他们合并到一起.
  1. 配置日志文件的存储路径,可以是相对路径,可以是绝对路径.路径中只可以设置路径.
logging:level:com:jrj:logger: tracefile:path: D:/personal

在这里插入图片描述
我们看到日志文件被保存在了指定的路径之下.
[注意] 如果name和path两个配置项同时存在的时候,优先使用name配置项.

1.5.3 配置日志文件的分割

如果日志一直不停地产生的话,日志文件就会越来越大.此时需要对项目的日志进行分割.当然,日志框架也考虑到了这一点,没有配置参数的默认情况下,一个日志文件满10M就会自动进行分割.

  • 配置项
    在这里插入图片描述
logging:file:path: D:/personallogback:rollingpolicy:file-name-pattern: ${spring_log}.%d{yyyy-MM-dd}.%i.gzmax-file-size: 2KB

上面的参数分别表示的是,分割后文件的名字,格式就是文件名+日期+索引+文件格式,以及一个日志文件的最大大小.

2. 更简单的日志输出

每次都使用LoggerFactory很繁琐,每个类都要添加一遍Logger对象,于是lombok就为我们提供了一种特别方便的方式.

  1. 添加lombok依赖
  2. 使用@Slf4j注解产生Logger对象,使用注解产生的对象进行日志输出.产生的这个对象默认的名字是log.注意注解中的首字母是大写的.
@RestController
@Slf4j
public class LoggerDemo {@PostConstructpublic static String printLogger(){log.info("打印info日志");log.error("打印error日志");log.warn("打印warn日志");log.debug("打印debug日志");log.trace("打印trace日志");return "打印日志";}
}

运行结果:
在这里插入图片描述
同样可以打印自定义的日志.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI在候选人评估中的作用:精准筛选与HR决策的助力

一、引言 随着科技的迅猛发展,人工智能(AI)技术已逐渐渗透到各个行业和领域,人力资源管理(HRM)亦不例外。在候选人评估的环节中,AI技术以其高效、精准的特性,正在逐步改变着传统的招…

深度学习 —— 个人学习笔记6(权重衰减)

声明 本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。 十三、权重衰减 使用以下公式为例做演示: y 0.05 ∑ i 1 d 0.01 x i ε w h e r e ε ~ N…

从PyTorch官方的一篇教程说开去(4 - Q-table来源及解决问题实例)

偷个懒,代码来自比很久之前看的书,当时还在用gym,我做了微调以升级到gymnasium当前版本,确保可以正常演示。如果小伙伴或者原作者看到了麻烦提一下,我好备注一下出处。 您的进步和反馈是我最大的动力,小伙…

语音识别 语音识别项目相关笔记内容

语音识别 语音识别项目相关笔记内容 语音识别应用范畴语音识别框架语音基本操作使用scipy.io.wavfile读取wav音频文件获取采样率、长度、通道数使用numpy读取pcm格式音频文件读取wav音频文件,并绘制图像读取双声道的wav音频文件,分别绘制不同声道的波形图读取一个采样率为16k…

【Docker】Docker Desktop - WSL update failed

问题描述 Windows上安装完成docker desktop之后,第一次启动失败,提示:WSL update failed 解决方案 打开Windows PowerShell 手动执行: wsl --set-default-version 2 wsl --update

使用 vue-element-plus-admin 框架遇到的问题记录

项目打包遇到的问题: 打包语句:pnpm run build:pro 报错信息: Error: [vite]: Rollup failed to resolve import "E:/workplace_gitee/xxx/node_modules/.pnpm/element-plus2.5.5_vue3.4.15/node_modules/element-plus/es/components…

【精品资料】数据安全治理解决方案(27页PPT)

引言:数据安全治理解决方案是一个综合性的体系,旨在通过策略、技术、流程和人力的有机结合,全面提升组织的数据安全防护能力,保障数据资产的安全与合规。 方案介绍:数据安全治理解决方案是组织为确保其数据资产的安全性…

Spark内核的设计原理

导读: 本期是DataFun深入浅出Apache Spark第一期的分享,主讲老师耿嘉安开场介绍了自己的从业经历,当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。 本次分享题目为《Spark内核的设计原理》&…

智能化一体闸门:助力行业发展

随着科技的飞速发展,智能化技术已经渗透到各个行业和领域,其中水利行业也不例外。智能化一体闸门以其高效、智能、便捷的特点,正助力着行业发展。 一、智能化一体闸门的定义与特点 智能化一体闸门,是集成了先进传感技术、自动控制…

Transformer之Swin-Transformer结构解读

写在最前面之如何只用nn.Linear实现nn.Conv2d的功能 很多人说,Swin-Transformer就是另一种Convolution,但是解释得真就是一坨shit,这里我郑重解释一下,这是为什么? 首先,Convolution是什么? Co…

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持,‌上电即可使用的语音识别系统。‌它的应用场合相对单一,‌主要适用于智能家电、‌语音遥控器、‌智能玩具等,‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…

Python文件写入读取,文件复制以及一维,二维,多维数据存储

基础解释 在 Python 中,文件操作的模式除了 w (只写)、 a (追加写)、 r (只读)外,还有以下几种常见模式:- r :可读可写。该文件必须已存在,写操…

分类损失函数 (一) torch.nn.CrossEntropyLoss()

1、交叉熵 是一种用于衡量两个概率分布之间的距离或相似性的度量方法。机器学习中,交叉熵常用于损失函数,用于评估模型的预测结果和实际标签的差异。公式: y:真是标签的概率分布,y:模型预测的概率分布 …

数据库中的内、外、左、右连接

常用的数据库连表形式: 内连接 :inner join 外连接 :outer join 左外连接 :left outer join 左连接 :left join 右外连接 right outer join 右连接: right join 全连接 full join 、union 一、内连接 内…

企业私有云的部署都有哪些方式?

如今常见的企业私有云的部署方式有自建私有云、托管私有云、虚拟私有云、混合云、容器化私有云、本地数据中心部署等。如今,企业私有云的部署呈多样化趋势,以用来满足各个企业的具体需求。以下是RAK部落小编为大家汇总的企业私有云常见的部署方式&#x…

LeetCode 58.最后一个单词的长度 C++

LeetCode 58.最后一个单词的长度 C 思路🤔: 先解决当最后字符为空格的情况,如果最后字符为空格下标就往后移动,直到不为空格才停止,然后用rfind查询空格找到的就是最后一个单词的起始位置,最后相减就是单词…

C++ 正则库与HTTP请求

正则表达式的概念和语法 用于描述和匹配字符串的工具,通过特定的语法规则,灵活的定义复杂字符串匹配条件 常用语法总结 基本字符匹配 a:匹配字符aabc:匹配字符串abc 元字符(特殊含义的字符) .:匹…

1Panel面板配置java运行环境及网站的详细操作教程

本篇文章主要讲解,通过1Panel面板实现java运行环境,部署网站并加载的详细教程。 日期:2024年7月21日 作者:任聪聪 独立博客:https://rccblogs.com/501.html 一、实际效果 二、详细操作 步骤一、给我的项目进行打包&am…

在jsPsych中使用Vue

jspsych 介绍 jsPsych是一个非常好用的心理学实验插件,可以用来构建心理学实验。具体的就不多介绍了,大家可以去看官网:https://www.jspsych.org/latest/ 但是大家在使用时就会发现,这个插件只能使用js绘制界面,或者…

STM32自己从零开始实操10:PCB全过程

一、PCB总体分布 分布主要参考有: 方便供电布线。方便布信号线。方便接口。人体工学。 以下只能让大家看到各个模块大致分布在板子的哪一块,只能说每个人画都有自己的理由,我的理由如下。 还有很多没有表达出来的东西,我也不知…