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状态 四…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...









