【JavaEE】Spring Boot 日志
目录
- 一、日志概述
- 二、使用日志
- 2.1 打印日志
- 2.2 日志框架
- 2.2.1 门面 / 外观 模式
- 2.3 日志级别
- 2.3.1 六大分类
- 2.3.2 使用
- 2.4 日志级别配置
- 2.5 日志的持久化
- 2.6 日志文件分割
- 2.7 日志文件格式
- 2.8 @Slf4j 简单打印日志
一、日志概述
⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途,像监控程序,当程序出现什么问题时,在日志中反应为相对应的日志,然后可以提醒程序猿。日志还可以记录数据,用于分析等等。
二、使用日志
我们先简单看一下一个Spring的日志包含的内容:

2.1 打印日志
我们在程序中打印SpringBoot的日志,我们先要拿到日志对象,在import org.slf4j包下的Logger对象。在从这个包下的静态类日志工厂 LoggerFactor拿到实例 。
private Logger logger = LoggerFactory.getLogger(LogController.class);
在通过Logger类中的info方法打印日志。
package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {LOGGER.info("日志");return "日志";}
}
得到的日志:

2.2 日志框架
在我们使用Logger类的时候,会有很多包。

这几个包的关系如下:

以电视机和遥控器来举例子,日志实现就相当于不同品牌的电视,而日志门面就相当于一个 通用的遥控器。
2.2.1 门面 / 外观 模式
门面模式:
⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接口. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.

⻔⾯模式主要包含2种⻆⾊:
外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝.⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem都不是⼀个单独的类, ⽽是⼀个类的集合. SubSystem 并不知道 Facade的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)
2.3 日志级别
2.3.1 六大分类
⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
- FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.
- ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.
- WARN: 警告信息, 不影响使⽤, 但需要注意的问题
- INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等.
- DEBUG: 调试信息, 需要调试时候的关键信息打印.
- TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
2.3.2 使用
对于不同级别的日志,SpringBoot的Logger类下面有对应名字的方法(FATAl)除外。
SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.
package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {//LOGGER.info("日志");LOGGER.trace("trace级别日志");LOGGER.debug("debug级别日志");LOGGER.info("info级别日志");LOGGER.warn("ware级别日志");LOGGER.error("error级别日志");return "日志";}
}
上诉代码的结果如下:

只会显示info级别及其以上级别的日志,这是因为Spring在默认的配置下是显示info级以上级别日志。
2.4 日志级别配置
我们只需要在配置文件加上:logging.level.目录就可以配置相对应目录下的日志显示级别。
如果我们在配置文件中加上这样的配置信息
logging:level:com:example:captcha:Controller: trace
那么我们打印的日志就会变成下面的这样:

2.5 日志的持久化
日志如果不进行配置,默认⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题.把⽇志保存下来就叫持久化。
我们就可以将日志写入文件。
Spring中有以下两个配置项,来配置日志写入的文件。
- logging.file.name配置项,可以包含文件的路径和文件名。
- logging.file.path配置项,只能包含文件路径。
- 当两个配置项同时存在的时候,只有logging.file.name会有作用。

我们进行如下配置:
logging:file:name: logger/log.logpath: all
得到如下结果:

2.6 日志文件分割
日志文件分割有以下两个相关的配置项:
- logging.logback. rolling policy.max-file-size配置项,用于配置每个文件的大小。
- logging.logback. rolling policy.file-name-pattern配置项,用于配置每个文件的名字及其格式。

我们写下如下配置:
logging:logback:rolling policy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
结果就如下:

注意事项:
- logging.logback. rolling policy.max-file-size配置项,并不是严格的每个文件都不会超过配置的大小,而是按照必须将当前的日志行写完才分割。
- logging.logback. rolling policy.file-name-pattern配置项,默认格式
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

2.7 日志文件格式
日志文件格式分割有以下两个相关的配置项:
| 配置项 | 说明 |
|---|---|
| logging.pattern.console | 控制台⽇志格式 |
| logging.pattern.file | ⽇志⽂件的⽇志格式 |
配置项说明:
- %clr(表达式){颜⾊}设置输⼊⽇志的颜⾊。支持blue cyan faint green magenta red yellow
- %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}} ⽇期和时间–精确到毫秒
- %5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.
- %t 线程名.
- %c 类的全限定名.
- %M method.
- %L 为⾏号.
- %thread 线程名称.
- %m 或者%msg 显⽰输出消息.
- %n 换⾏符
- %5 若字符⻓度⼩于5,则右边⽤空格填充.
- %-5 若字符⻓度⼩于5,则左边⽤空格填充.
- %.15 若字符⻓度超过15,截去多余字符.
- %15.15 若字符⻓度⼩于15,则右边⽤空格填充.若字符⻓度超过15,截去多余字符
2.8 @Slf4j 简单打印日志
我们可以使用lombok提供的@Slf4j注解来打印日志,这个注解的作用相当于就是sping帮我们创建Logger对象,对象名为log。
例如下面代码:
package com.example.captcha.Controller;import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
@Slf4j
public class LogController {@RequestMapping("/print")public String print() {//LOGGER.info("日志");log.trace("trace级别日志");log.debug("debug级别日志");log.info("info级别日志");log.warn("ware级别日志");log.error("error级别日志");return "日志";}
}
结果如下:

相关文章:
【JavaEE】Spring Boot 日志
目录 一、日志概述二、使用日志2.1 打印日志2.2 日志框架2.2.1 门面 / 外观 模式 2.3 日志级别2.3.1 六大分类2.3.2 使用 2.4 日志级别配置2.5 日志的持久化2.6 日志文件分割2.7 日志文件格式2.8 Slf4j 简单打印日志 一、日志概述 ⽇志主要是为了发现问题, 分析问题, 定位问题…...
Qt中的 #include “xxxx.moc“ 说明
Qt中的 #include “xxxx.moc” 说明 在Qt开发中,有时会看到在cpp文件末尾包含 #include "xxxx.moc" 这样的代码。这种做法主要用于以下情况: 使用场景 当你在非头文件中定义了一个包含Q_OBJECT宏的类时,需要包含对应的.moc文件。…...
如何用solidworks画齿轮
齿轮还是很有技术含量的,专业名词太多看不懂, 只会画 (这个东西不能自己想当然画, 齿轮之间不啮合是很有问题的,会积累磨损) 步骤1 打开设计库里的toolbox 选择正齿轮,右键生成零件 需要改的有几个关键的地方,我是只知道内圆外圆所以,对我来说最重要的是标称轴直径 (即正中间…...
详解布隆过滤器及其模拟实现
目录 布隆过滤器 引入 概念 工作原理 模拟实现布隆过滤器 哈希函数集 布隆过滤器基本框架 add函数(添加到布隆过滤器中) contains函数(判断是否存在该值) 完整代码 布隆过滤器的删除 布隆过滤器的误判率 布隆过滤器的…...
element-plus中DatePicker 日期选择器组件的使用
1.选择某一天 代码: <el-date-pickerv-model"invoice_date"type"date"placeholder"请选择日期"style"width: 200px;"clearable /> 运行效果: 问题所在:这个数据的格式不是我们后端需要的那种&…...
SvelteKit 最新中文文档教程(4)—— 表单 actions
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
力扣hot100二刷——二叉树
第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路,编程也很流利⭐⭐Basically 基本掌握需要稍作思考,或者看到提示方法后能解答⭐⭐⭐Sl…...
企业安全——数据泄露防护
0x00 前言 本篇对数据泄露防护方面的内容进行汇总和总结,为抛砖引玉的内容 0x01 数据隔离 数据隔离是防止数据泄露的一个非常好的方式,通常的隔离方式有 主机/服务器隔离网络隔离介质隔离 0x02 数据丢失预防 主要防止数据丢失的方法就是DLP&#x…...
字符串哈希从入门到精通
一、基本概念 字符串哈希是将任意长度的字符串映射为固定长度的哈希值(通常为整数)的技术,核心目标是实现O(1)时间的子串快速比较和高效查询。其本质是通过数学运算将字符串转换为唯一性较高的数值,例如: …...
C语言:编程设计猜数游戏
先由计算机想一个数给用户猜,如果猜对了,提示“right!”,猜错了,提示“wrong!及大小” 思路:用随机函数rand()取到计算机想的数 代码: #include <stdio.…...
地下车库智能停车位指引系统方案(还有缺陷)
一、系统核心技术架构 通过车牌识别+车位检测+室内定位+路径规划四大技术模块实现全自动指引: 二、关键技术方案 1. 车辆身份识别与入场触发 车牌识别(LPR)技术 入口处部署高清摄像头,自动识别车牌并关联车辆信息(如会员、临时车)。触发逻辑:识别成功后抬杆放行,同时…...
Docker 使用指南
Docker 是一种开源的容器化平台,它通过使用容器来进行应用程序的打包、分发和部署。下面是 Docker 的基本概念和优势: 容器化:Docker 使用容器来封装应用程序及其所有依赖项,使其能够在任何环境中运行,并且与底层系统隔…...
win10 c++ VsCode 配置PCL open3d并显示
win10 c VsCode配置PCL open3d并显示 一、效果图二、配置步骤2.1 安装vscode2.2 pcl-open3d配置2.3 vscode中设置 三、测试代码四、注意事项及后续 一、效果图 二、配置步骤 2.1 安装vscode vscode下载链接 下载中文插件、c相关插件 2.2 pcl-open3d配置 1)下载…...
Vala 开发环境搭建
介绍 Vala 是一种使用现代高级抽象的编程语言,与用 C 语言编写的应用程序和库相比,没有施加额外的运行时要求,也不需要使用不同的 ABI。 Vala 使用 GObject 类型系统,并具有额外的代码生成例程,使面向 GNOME 堆栈变得简…...
【网页】自制流光卡片
概述 小红书有个博主自己搞的笔记排版工具叫“流光卡片”,类似的还有个Markdown排版工具叫MD2Card。 我这个版本类似,但是自己写的东西,控制性更好。 初期就写了个静态页面,后期结合Godot快速生成,并可能结合JS库&a…...
【数据结构】栈与队列:基础 + 竞赛高频算法实操(含代码实现)
什么是栈?什么是队列? 什么是先进后出?什么是先进先出? 了解基础之后,又如何用来写算法题? 带着这些疑问,让我带领你,走进栈与队列的世界 栈与队列 栈: 1、栈的基本…...
CSP-J/S冲奖第18天:真题解析
解题步骤 读取输入:首先读取整数n,然后读取n个正整数并存储在一个数组或容器中。 排序数组:对数组进行排序,以便后续使用双指针法高效查找。 遍历数组:对于每个数target,检查是否存在另外两个不同的数a和…...
【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:
项目场景: 提示:虚拟机安装拓展包,sudo yum install perl Virtualbox 在不安装增强功能扩展的情况下, 无法自适应分辨率和共享剪切板等操作 问题描述 原因分析: 提示:这里填写问题的分析: 出现这个错误是因…...
旅游类小程序界面设计
产品概述 艾啦游是一款互联网旅游类小程序,致力于国内精品旅游,以及拥有自由行、专属热榜单、出行攻略等诸多功能,汇聚了许多国内的人气景点,与诸多城市的酒店也保持合作,打造一体式旅行服务,更有不断上新…...
DQN 玩 2048 实战|第三期!优化网络,使用GPU、Env奖励优化
视频讲解: DQN 玩 2048 实战|第三期!优化网络,使用GPU、Env奖励优化 1. 仅考虑局部合并奖励:目前的奖励只设置为合并方块时获得的分数,只关注了每一步的即时合并收益,而没有对最终达成 2048 这个…...
【python】http post 在body中传递json数据 以发送
http post 在body中传递json数据 以发送,json的格式非常重要这里要传递json对象,而不是一个json字符串 传递post一个 JSON 字符串 是ok的 是的, {"rsource_rhythm_action_list": {"name": "AI_\\u6708\\u4eae\\u…...
Linux错误(2)程序触发SIGBUS信号分析
Linux错误(2)之SIGBUS错误分析 Author: Once Day Date: 2025年3月12日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践记录_Once_day的博…...
【Halcon】灰度不均解决方案
目录 1、平场校正 2、形态学背景估计 3、频域滤波抑制低频光照不均 4、动态局部自适应 1、平场校正 原理:通过白场(White Image)和黑场(Black Image)图像,手动计算校正系数 * 读取图像 read_image(ImageRaw, raw_image) // 原始图像 read_image(ImageWhite, …...
滑动窗口算法详解:从入门到精通
目录 引言 1. 滑动窗口算法简介 2. 滑动窗口的基本思想 3. 滑动窗口的应用场景 3.1 最大子数组和 3.2 最小覆盖子串 3.3 最长无重复字符子串 4. 滑动窗口的实现步骤 5. 滑动窗口的代码示例 6. 滑动窗口的优化技巧 6.1 使用哈希表记录字符频率 6.2 使用双指针维护窗口…...
JAVA数据库技术(一)
JDBC 简介 JDBC(Java Database Connectivity)是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库,并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式,使…...
LightGBM + TA-Lib A股实战进阶:Optuna调优与Plotly可视化详解
LightGBM TA-Lib A 股实战进阶:Optuna 调优与 Plotly 可视化详解 本文系统讲解了 LightGBM 在 A 股市场的应用,涵盖模型构建、Optuna 参数调优及 Plotly 可视化。通过实战案例,帮助读者全面掌握相关技术,提升在金融数据分析与预测…...
第二:go 链接mysql 数据库
mac mysql 安装 的步骤 mysql 安装 配制: https://juejin.cn/post/7454870544929472550 mac brew 如何安装mysql数据库 要在Mac上使用Homebrew安装MySQL数据库,请按照以下步骤操作:步骤 1: 安装Homebrew 如果你还没有安装Homebrew&a…...
QListView、QListWidget、QTableView和QTableWidget
一、概念 在Qt框架中,QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。 QListView是一个基于模型-视图架构的控件,用于展示列表形式的数据。它本身并不存储数据,而是依赖于一个QAbstractListModel或其子…...
[贪心算法]-最大数(lambda 表达式的补充)
1.解析 我们一般使用的排序比较大小都是 a>b 那么a在b的前面 ab 无所谓 a<b a在b的后面 本题的排序则是 ab>ba 那么a在b的前面 abba 无所谓 ab<ba a在b的后面 2.代码 class Solution { public:string largestNumber(vector<int>& nums) {//1.先把所有…...
C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)
目录 1. 数组名与地址 2. 指针访问数组 3.一维数组传参本质 4.二级指针 5. 指针数组 6. 指针数组模拟二维数组 1. 数组名与地址 我们先看下面这个代码: int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数…...
