Spring Boot 支持哪些日志框架
Spring Boot 支持多种日志框架,主要包括以下几种:
- SLF4J (Simple Logging Facade for Java) + Logback(默认)
- Log4j 2
- Java Util Logging (JUL)
其中,Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使用其他日志框架(如 Log4j 2),可以通过添加相关依赖和配置来替代默认的 Logback。
下面将分别介绍如何在 Spring Boot 中使用不同的日志框架,并给出相应的示例代码。
1. 默认日志框架:SLF4J + Logback
Spring Boot 默认集成了 SLF4J 和 Logback,因此你无需添加额外的依赖,只需要在代码中使用 SLF4J API 即可。

示例代码:
package com.hk.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class UserService {private static final Logger logger = LoggerFactory.getLogger(UserService.class);public void registerUser(String username) {logger.debug("Debug: Starting user reg for {}", username);try {if (!StringUtils.hasText(username)) {logger.error("Error: Username 不能为null");throw new IllegalArgumentException("Username 不能为null");}logger.info("Info: User {} reg successfully", username);} catch (Exception e) {logger.error("Error: User registration failed for {}", username, e);}}
}
配置日志级别(application.yml):
logging:file:name: logs/application.log # 配置日志文件level:com:hk: DEBUG # 设置特定包的日志级别root: INFO # 设置根日志级别为 INFO
2. 使用 Log4j 2 作为日志框
如果你希望使用 Log4j 2 代替 Logback,可以按照以下步骤操作:
步骤 1:添加 Log4j 2 依赖
首先,你需要在 pom.xml 中排除默认的 Logback 依赖并添加 Log4j 2 的依赖。
<dependencies><!-- 排除默认的 Logback 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><scope>provided</scope></dependency><!-- 添加 Log4j 2 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>
步骤 2:创建 Log4j 2 配置文件(log4j2.xml)
在 src/main/resources/ 目录下创建 log4j2.xml 文件,配置 Log4j 2 的日志输出格式和日志级别。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!-- 配置 Console Appender 输出 --><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout><Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern></PatternLayout></Console></Appenders><!-- 配置 Logger --><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>
步骤 3:使用 Log4j 2 记录日志
Log4j 2 同样支持 SLF4J 接口,因此在代码中不需要做特别的修改,依然可以使用 SLF4J API 记录日志。
package com.hk.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class UserService {private static final Logger logger = LoggerFactory.getLogger(UserService.class);public void registerUser(String username) {logger.debug("Debug: Starting user reg for {}", username);try {if (!StringUtils.hasText(username)) {logger.error("Error: Username 不能为null");throw new IllegalArgumentException("Username 不能为null");}logger.info("Info: User {} reg successfully", username);} catch (Exception e) {logger.error("Error: User registration failed for {}", username, e);}}
}
3. 使用 Java Util Logging (JUL)
如果你想使用 Java Util Logging (JUL),你可以通过以下方式进行配置:
步骤 1:排除默认的 Logback 依赖
和 Log4j 2 一样,需要排除默认的 Logback 依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><scope>provided</scope>
</dependency>
步骤 2:配置 application.yml
logging:file:name: logs/application.log # 配置日志文件level:root: INFO # 设置根日志级别为 INFO
步骤 3:使用 JUL 记录日志
需要简单的修改代码
package com.hk.service;import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.logging.Logger;@Service
public class UserService {private static final Logger logger = Logger.getLogger(UserService.class.getName());public void registerUser(String username) {logger.fine("Debug: Starting user reg for" + username);try {if (!StringUtils.hasText(username)) {logger.severe("Error: Username 不能为null");throw new IllegalArgumentException("Username 不能为null");}logger.info("Info: User " +username +"reg successfully");} catch (Exception e) {logger.severe("Error: User registration failed for" + username);e.printStackTrace();}}
}
总结
Spring Boot 支持多种日志框架,并且允许你轻松切换这些框架:
- 默认使用 SLF4J 和 Logback,无需额外配置。
- 使用 Log4j 2 时,需要排除默认的 Logback 并添加 Log4j 2 依赖和配置。
- 使用 Java Util Logging (JUL) 时,配置日志级别并使用
java.util.logging.Logger
相关文章:
Spring Boot 支持哪些日志框架
Spring Boot 支持多种日志框架,主要包括以下几种: SLF4J (Simple Logging Facade for Java) Logback(默认)Log4j 2Java Util Logging (JUL) 其中,Spring Boot 默认使用 SLF4J 和 Logback 作为日志框架。如果你需要使…...
【翻译】2025年华数杯国际赛数学建模题目+翻译pdf自取
保存至本地网盘 链接:https://pan.quark.cn/s/f82a1fa7ed87 提取码:6UUw 2025年“华数杯”国际大学生数学建模竞赛比赛时间于2025年1月11日(周六)06:00开始,至1月15日(周三)09:00结束ÿ…...
qt 窗口(window/widget)绘制/渲染顺序 QPainter QPaintDevice Qpainter渲染 失效 无效 原因
qt窗体布局 窗体渲染过程 qt中窗体渲染逻辑顺序为 本窗体->子窗体/控件 递归,也就是说先渲染父窗体再渲染子窗体。其中子窗体按加入时的先后顺序进行渲染。通过下方的函数调用堆栈可以看出窗体都是在widget组件源码的widgetprivate::drawwidget中进行渲染的&am…...
TIOBE编程语言排行靠前的编程语言的吉祥物
Python的吉祥物:小蟒蛇 Python语言的吉祥物是一只名叫"Pythonidae"(或简称"Py")的小蟒蛇。这个吉祥物由Tobias Kohn设计于2005年,它的形象借鉴了真实的蟒蛇,但加入了一些可爱和友善的特点。小蟒蛇…...
【前端动效】HTML + CSS 实现打字机效果
目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示,这次带来的是一个有趣的“擦除”效果,也可以叫做打字机效果,其中一段文本从左到右逐渐从…...
大疆上云API连接遥控器和无人机
文章目录 1、部署大疆上云API关于如何连接我们自己部署的上云API2、开启无人机和遥控器并连接自己部署的上云API如果遥控器和无人机没有对频的情况下即只有遥控器没有无人机的情况下如果遥控器和无人机已经对频好了的情况下 4、订阅无人机或遥控器的主题信息4.1、订阅无人机实时…...
JS逆向-atob和btoa分析
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 故事是这样的,有位读者朋友需要模拟登录一个网站: aHR0cDovL3d3dy56bGRzai5jb20v 我…...
primitive 编写着色器材质
import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体,Cesium.RectangleGeometry:几何体,Rectangle:矩形 let rectGeometry new…...
计算机视觉算法实战——车道线检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 车道线检测是计算机视觉领域的一个重要研究方向,尤其在自动驾驶和高级驾驶辅助…...
网络安全-安全散列函数,信息摘要SHA-1,MD5原理
安全散列函数 单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要。数据指纹)。还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求 散列函数的目的是文件、消息或者其它数据…...
树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍
文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…...
《零基础Go语言算法实战》【题目 2-10】接口的实现
《零基础Go语言算法实战》 【题目 2-10】接口的实现 请指出下面代码中存在的问题。 type Programmer struct { Name string } func (p *Programmer) String() string { return fmt.Sprintf("print: %v", p) } func main() { p : &Programmer{} p.String()…...
Win32汇编学习笔记10.OD插件
Win32汇编学习笔记10.OD插件-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 筛选器异常插件 被调试程序: 📎TestUnh.zip 我们用OD条试试发现,无法断下 筛选器异常 异常产生之后 异常首先会给调试器 调试器不处理就会给 SEH , SEH 不处理的话有又给…...
在vscode中已经安装了插件Live Server,但是在命令面板确找不到
1、VS Code缓存问题: 有时VS Code的缓存可能导致插件无法正确加载。尝试删除VS Code缓存文件夹(如C:\Users\你的用户名\AppData\Roaming\Code)中的文件,并重启VS Code。 2、重新安装插件: 尝试卸载Live S…...
C# SQL ASP.NET Web
留学生的课程答疑 按照要求完成程序设计、数据库设计、用户手册等相关技术文档; 要求 1. 计算机相关专业,本科以上学历,至少有1年以上工作经验或实习经历。 2. 熟练掌握WinForm程序开发,或ASP.NET Web编程。 3. 熟悉C#中网络…...
联想java开发面试题及参考答案
IP 协议是哪一层的? IP 协议(Internet Protocol)属于网络层协议。 网络层主要负责将数据从源节点传输到目标节点,它在整个网络通信体系中起到了承上启下的关键作用。在分层网络模型中,下层(如数据链路层)为网络层提供物理链路的连接和帧传输服务。数据链路层关注的是在相…...
Node.js中的fs模块:文件与目录操作(写入、读取、复制、移动、删除、重命名等)
在Node.js中,fs模块提供了多种方法来处理文件和目录操作,使得数据的持久性保存和文件管理变得简单。下面将介绍文件读写、文件复制、文件移动、文件重命名、文件删除、文件夹创建与删除以及查看资源状态等常用操作。 首先,在使用写入和读取功…...
代码的形状:重构的方向
大概2周前写了一篇《代码的形状:从外到内的探索与实践》 涵树:代码的形状:从外到内的探索与实践 觉得这个话题还可以继续,它是一个从无形到有形的过程,而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状ÿ…...
2021 年 3 月青少年软编等考 C 语言五级真题解析
目录 T1. 红与黑思路分析T2. 密室逃脱思路分析T3. 求逆序对数思路分析T4. 最小新整数思路分析T1. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的…...
华为C语言编程规范总结
1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此: 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件,…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
