2023.11.17 关于 Spring Boot 日志文件
目录
日志文件作用
常见的日志框架说明
门面模式
日志的使用
日志的级别
六种级别
日志级别的设置
日志的持久化
使用 Lombok 输出日志
实现原理
普通打印和日志的区别
日志文件作用
- 记录 错误日志 和 警告日志(发现和定位问题)
- 记录 用户登录日志,分析用户是否正常登录
- 记录 系统操作日志,方便 数据恢复 和 定位操作人
- 记录程序执行时间,方便以后为优化程序提供数序支持
常见的日志框架说明
门面模式
- 设计模式的一种
- 门面模式就是一种通过引入一个简化接口来隐藏复杂细系统的设计模式,它提供了一种简单的方式让客户端与系统进行交互,同时降低了客户端和系统之间的耦合度
简单理解
- 日志系统有多个,即多个不同的框架,框架的本质是多个工具类的集合
- 不同的框架有着不同的类名,不同的类名也有着不同的方法名
- 所以 Log4j、JUL、Logback、Slf4j-Simple 这些日志系统的写法完全一点边都不沾
导致问题
- 如果此时直接在应用程序中以 Log4j 日志系统为基本进行日志操作
- 有一天 Log4j 日志系统 出现了严重 bug,需要将该应用程序的 日志系统 改为 Logback 时
- 因为这两个日志系统的写法完全一点边不沾,所以此时应用程序中需要修改代码就会很多很多
解决方法
- 引入日志门面
- 我们按照 日志门面 所提供的写法来写日志操作代码
- 然后 日志门面 会根据程序员的配置 和 程序员引入的驱动 来操作最底层的日志系统
- 通过该方式便可轻松切换日志系统
- 从而很大程度上降低了应用程序和日志系统的耦合度
- Spring Boot 内置的日志门面是 Slf4j 、日志系统是 Logback
日志的使用
得到日志对象
- 在 TestController 类中使用日志工厂 LoggerFactory 获取日志对象
- 日志在程序运行期间只加载一次,并且不可变,所以使用 static 和 final 修饰
// 1.得到日志对象private static final Logger log = LoggerFactory.getLogger(TestController.class);注意:
- Logger 有很多一定要选择导入下图红框的包
使用日志对象提供的方法打印日志
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @ResponseBody // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据 @RequestMapping("/test") // = @WebServlet("/url") public class TestController { // 1.得到日志对象private static final Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/say-hi") // = @WebServlet("/url")public String sayHi() { // 2.打印日志log.trace("i am trace");log.debug("i am debug");log.info("i am info");log.warn("i am warn");log.error("i am error");return "hello world ";} }运行结果:
- 先在浏览器中访问下图路径
- 再观察控制台输出的日志信息
- 我们自定义打印的日志信息有五条
- 在上图运行结果中,控制台却仅打印了后三条日志信息
- 因为此时 Spring Boot 默认打印的日志级别为 info 级别
- 即 大于或等于 info 级别的日志信息才会打印出来
日志的级别
六种级别
trace
- 微量,少许的意思,级别最低
debug
需要调试的时候的关键信息打印
info
- 普通的打印信息,默认日志级别
warn
- 警告,不影响使用,但需要注意的问题
error
- 错误信息,级别较高的错误日志信息
fatal
- 致命的,因为代码异常导致程序退出执行的事件
日志级别的设置
- 日志输出的默认级别是 info
- 我们可以在配置文件中手动配置默认日志输出级别
- 在配置文件 application.yml 中,加入下段配置代码即可
logging:level:root: warn
- 上述配置代码的作用域为根目录(root)下的所有包
- 表示设置根日志记录器的级别为 warn
- 这意味着,应用程序中所有的日志记录器都将继承这个级别
- 除非它们已经被明确地设置了其他级别
运行结果:
- 如果我们想设置指定某一包下的日志输出级别
- 可按下图方式添加配置代码
- 红框路径以 java 目录为起始目录
运行结果:
- 明确指定某一包下的日志输出级别的优先级高于 使用 root 指定根目录下所有包的日志输出级别
日志的持久化
- 上述日志的仅在控制台输出
- 在生产环境中我们需要将日志保存下来
- 以便出现问题后可以追溯问题
两种方式
指定日志的存储目录
- 启动 Spring Boot 后
- 在 E盘的 test 目录下的 testDemo 目录下会出现日志文件
- 如果启动前无该路径,启动后便会自动创建出该路径
logging:file:path: E://test//testDemo指定日志文件的文件名
- 启动 Spring Boot 后
- 会在指定目录下生产一个名为 spring-log.log 的日志文件
logging:file:path: E://test//testDemo//spring-log.log注意点一:
- 在Spring Boot 中进行日志记录时
- 如果没有指定日志文件的名称 或 两次保存的日志指定了相同的文件名
- 那么第二次运行Spring Boot 时,其保存的日志信息会被追加到第一次保存的日志文件后面,而不是覆盖第一次保存的日志信息
- 因为 Spring Boot 的日志系统默认是以 追加模式 来写入日志的
- 也就是说每次写入日志时,都会在原有日志的基础上添加新的日志信息,而不会删除或覆盖原有的日志
注意点二:
- 日志文件的大小通常会有一个上限
- 这是为了防止日志文件过大导致加载速度变慢
- 当日志文件达到一定大小后,Spring Boot 会自动创建一个新的日志文件
- 以防止单个日志文件过大
- 通过下段配置代码,可以实现手动配置日志文件的大小上线
logging:file:path: E://test//testDemo//spring-log.logmax-size: 10MB
- 该段配置代码将日志文件的大小上限设置为 10MB
使用 Lombok 输出日志
实例理解
- 我们在 EasyController 类上加 @Slfj 注解
- 即可直接在该类中使用 log 对象
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @ResponseBody @Slf4j public class EasyController {@RequestMapping("/test/easy")public void sayHi() {log.error("i am error");} }
实现原理
- Java 程序在 IDEA 中执行完后会生产一个 target 文件
- 该文件为源代码完成去掉注释等一系列工作后的文件
- 且该文件就是该项目执行的最终代码
- 我们发现 lombok的事件原理就是在编译阶段加上了我们原本需要的代码
普通打印和日志的区别
最关键的两个区别
- 普通打印 没有级别的控制,无法进行信息的筛选
- 普通打印 不支持持久化,无法保存下来
相关文章:
2023.11.17 关于 Spring Boot 日志文件
目录 日志文件作用 常见的日志框架说明 门面模式 日志的使用 日志的级别 六种级别 日志级别的设置 日志的持久化 使用 Lombok 输出日志 实现原理 普通打印和日志的区别 日志文件作用 记录 错误日志 和 警告日志(发现和定位问题)记录 用户登录…...
【框架整合】Redis限流方案
1、Redis实现限流方案的核心原理: redis实现限流的核心原理在于redis 的key 过期时间,当我们设置一个key到redis中时,会将key设置上过期时间,这里的实现是采用lua脚本来实现原子性的。2、准备 引入相关依赖 <dependency>…...
NSS [鹤城杯 2021]Middle magic
NSS [鹤城杯 2021]Middle magic 源码直接给了。 粗略一看,一共三个关卡 先看第一关: if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)level(.*)$/, ${1}<!-- filtered -->${2}, $_GET[aaa]);if(preg_m…...
Sqlite安装配置及使用
一、下载SQLite Sqlite官网 我下载的是3370000版本:sqlite-dll-win64-x64-3370000.zip 和 sqlite-tools-win32-x86-3370000.zip 二、解压下载的两个压缩包 三、配置环境 四、检查是否安装配置成功 winR:输入cmd调出命令窗口,输入sqlite3后回车查看s…...
参数估计(一)(点估计)
文章目录 点估计和估计量的求法点估计概念矩估计法极大似然估计法 参考文献 参数估计是数理统计中重要的基本问题之一。通常,称参数的可容许值的全体为参数空间,并记为 Θ \Theta Θ。所谓参数估计就是由样本对总体分布所含的未知参数做出估计。另外&am…...
kubenetes-服务发现和负载均衡
一、服务发布 kubenetes把服务发布至集群内部或者外部,服务的三种不同类型: ClusterlPNodePortLoadBalancer ClusterIP是发布至集群内部的一个虚拟IP,通过负载均衡技术转发到不同的pod中。 NodePort解决的是集群外部访问的问题,用户可能不…...
docker的基本使用以及使用Docker 运行D435i
1.一些基本的指令 1.1 容器 要查看正在运行的容器: sudo docker ps 查看所有的容器(包括停止状态的容器) sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…...
如何看待人工智能行业发展
随着人工智能技术的飞速发展,这个领域的就业前景也日益广阔。人工智能在各行各业都有广泛的应用,包括医疗、金融、制造业、教育等。因此,对于想要追求高薪、高技能职业的人来说,学习人工智能是一个非常有前景的选择。 首先&#x…...
linux中实现自己的bash
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…...
14 Go的类型转换
概述 在上一节的内容中,我们介绍了Go的错误处理,包括:errors包、返回错误、抛出异常、捕获异常等。在本节中,我们将介绍Go的类型转换。在Go语言中,类型转换是一种将一个值从一种类型转换为另一种类型的过程。类型转换主…...
多线程概述
文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…...
AR贴纸特效SDK,无缝贴合的虚拟体验
增强现实(AR)技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合,为用户提供了一种全新的交互体验。然而,如何将AR贴纸完美贴合在人脸的面部,同时支持多张人脸的检测和标点及特效添加࿰…...
Leetcode hot 100
双指针 283.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {int cnt 0;for(vector<int>::iterator it nums.begin(); it ! nums.end(); ){if(*it 0) it nums.erase(it),cnt;else it;}while(cnt--){nums.push_back(0);}} }; 11.盛…...
分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测
分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测(完整源码和数据) 2.多…...
矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例
1. 协方差矩阵定义 在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度。 参考: 带你了解什么是Covariance Matrix协方差矩阵 - 知乎 2. 协方差矩阵计算过程 将输入数据A进行中心化处理得到A…...
100天精通Python(可视化篇)——第108天:Pyecharts绘制多种炫酷词云图参数说明+代码实战
文章目录 专栏导读一、词云图介绍1. 词云图是什么?2. 词云图应用场景?二、参数说明1. 导包2. add函数三、词云库实战1. 基础词云图2. 矩形词云图3. 三角形词云图4. 菱形词云图5. 自定义图片词云图书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本…...
Spark 平障录
Profile Profile 是最重要的第一环。 利用好 spark UI 和 yarn container log分析业务代码,对其计算代价进行预判建设基准,进行对比,比如application id 进行对比,精确到 job DAG 环节 充分利用 UI Stage 页面 页头 summary&…...
基于一致性算法的微电网分布式控制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿,实现功率均分,保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类:协调同…...
Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称
1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…...
飞鼠异地组网工具实战之访问k8s集群内部服务
飞鼠异地组网工具实战之访问k8s集群内部服务 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践场景描述2.2 本次实践前提2.3 本次实践环境规划 三、检查本地k8s集群环境3.1 检查k8s各节点状态3.2 检查k8s版本3.3 检查k8s系统pod状态 四…...
装机:WIN10家庭版升级专业版
https://ubuntu.com/download/desktop/thank-you?version24.04.4&architectureamd64<strue 装机:WIN10家庭版升级专业版Win10、Win11不重装系统情况下怎么使用一条命令实现家庭版升级为专业版或企业版?https://mp.weixin.qq.com/s/bIcRu6A_cl…...
数字IC设计的未来:ChatGPT能否颠覆十大核心领域?
1. ChatGPT在数字IC设计中的定位 最近两年AI工具的发展确实让人眼前一亮,特别是ChatGPT这种大语言模型,在代码生成、技术问答方面展现出了惊人的能力。作为一名在数字IC设计领域摸爬滚打多年的工程师,我也第一时间测试了它在芯片设计各个环节…...
Phantom Stealer 凭证窃取机制分析与防御体系研究
摘要 Phantom Stealer 作为 2025 年下半年出现的新型多功能信息窃取木马,以多阶段感染、无文件驻留、强反检测与全维度凭证窃取为核心特征,通过伪装合法软件、脚本混淆、进程注入、 Heaven’s Gate 技术规避等手段,精准窃取浏览器密码、Cooki…...
改进遗传算法求解分布式柔性作业车间调度问题 Matlab代码 考虑多工厂约束,以最小化最大完工...
改进遗传算法求解分布式柔性作业车间调度问题 Matlab代码 考虑多工厂约束,以最小化最大完工时间为目标函数,使用ipox、ux两种交叉方式,改进G-L-R初始化机制提升初始种群质量,使用变邻域搜索机制对空间进行局部搜索 更换关键工厂中…...
IUV5G数字室分酒店项目实战:从勘察到验收的避坑指南
1. 站点勘察:这些细节不注意会让你返工 第一次做酒店5G室分项目时,我在勘察环节踩过不少坑。记得有次因为没注意电梯井的测量方式,导致后期设计方案全部推翻重做。下面这些实战经验,能帮你省去至少50%的返工时间。 经纬度记录有个…...
别再傻傻分不清了!一文搞懂HIS、LIS、PACS这些医院里的‘系统天团’
医疗信息化系统全解析:从HIS到PACS的协同作战指南 第一次走进医院信息中心时,那些闪烁的服务器和此起彼伏的术语让我头晕目眩——HIS、LIS、PACS...它们就像医院里的"复仇者联盟",每个系统都是独特的超级英雄,但又必须完…...
遗传算法求解分布式柔性作业车间调度问题的Matlab代码:多工厂约束下最小化最大完工时间,采用...
遗传算法求解分布式柔性作业车间调度问题 Matlab代码考虑多工厂约束,以最小化最大完工时间为目标函数,使用ipox、ux两种交叉方式,交换变异邻域。 可选择测试算例。车间里机器轰鸣声不断,老王盯着墙上五颜六色的生产进度表直挠头。…...
如何在5分钟内快速上手Wade搜索库:终极快速入门指南
如何在5分钟内快速上手Wade搜索库:终极快速入门指南 【免费下载链接】wade :ocean: Blazing fast 1kb search library 项目地址: https://gitcode.com/gh_mirrors/wa/wade Wade是一个轻量级、高性能的JavaScript搜索库,仅1kb大小却提供了强大的全…...
医学影像3D可视化的技术革新:MRIcroGL如何重构临床诊断流程
医学影像3D可视化的技术革新:MRIcroGL如何重构临床诊断流程 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 在医学影像分析…...
构建企业级AI客服系统:从知识库集成到无缝转人工的实战指南
1. 企业级AI客服系统架构设计 第一次搭建AI客服系统时,我犯了个典型错误——直接调用大模型API就开始开发前端界面。结果上线后才发现,当用户量超过50人时响应速度直线下降,转人工功能更是形同虚设。这个教训让我明白,企业级系统必…...









