当前位置: 首页 > news >正文

Spring Boot日志系统详解:Logback与SLF4J的默认集成

大家好呀!👋 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统!

一、日志系统的重要性

首先,咱们得明白为什么日志这么重要?🤷‍♂️

想象一下,你正在玩一个超级复杂的游戏🎮,突然游戏崩溃了💥,但是没有任何提示!这时候你是不是特别想知道到底哪里出了问题?😫 日志就像是程序的"日记本"📔,它记录着程序运行时的各种信息,帮助我们:

  1. 排查问题🔍:当程序出错时,通过日志可以快速定位问题
  2. 监控运行状态👀:了解程序当前的运行情况
  3. 分析用户行为📊:记录用户的操作轨迹
  4. 性能优化⚡:通过日志分析系统瓶颈

在Spring Boot中,日志系统是开箱即用的,而且默认集成了Logback和SLF4J,这俩到底是什么呢?咱们接着往下看!👇

二、SLF4J和Logback简介

1. SLF4J - 日志门面

SLF4J(Simple Logging Facade for Java)就像是日志系统的"遥控器"📱,它定义了一套统一的日志接口,但不负责具体的日志实现。这样做的好处是:

  • 解耦🔗:你的代码只依赖SLF4J接口,不关心底层用哪种日志实现
  • 灵活🤸:可以随时更换底层日志框架而不需要修改代码
  • 统一🔄:所有日志都通过同一个接口输出
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {// 通过SLF4J获取Loggerprivate static final Logger logger = LoggerFactory.getLogger(MyClass.class);public void doSomething() {logger.info("这是一条信息日志");logger.error("这是一条错误日志");}
}

2. Logback - 日志实现

Logback是SLF4J的"原生实现"💎,也是Spring Boot默认的日志框架。它比传统的Log4j性能更好、功能更强大:

  • 速度快⚡:执行速度比Log4j快
  • 配置灵活🎛️:支持XML和Groovy配置
  • 自动重载🔄:修改配置文件后自动生效
  • 丰富的过滤功能🔍:可以精细控制日志输出

三、Spring Boot中的默认日志配置

Spring Boot为我们做了很多自动配置工作,让我们来看看它是如何集成Logback和SLF4J的!🔧

1. 自动配置原理

当你在Spring Boot项目中添加spring-boot-starterspring-boot-starter-web依赖时,它会自动引入:

org.springframework.bootspring-boot-starter-logging

这个starter又引入了以下依赖:

  • logback-classic (包含Logback和SLF4J绑定)
  • jul-to-slf4j (将Java Util Logging重定向到SLF4J)
  • log4j-to-slf4j (将Log4j2重定向到SLF4J)

这样,无论你使用哪种日志API,最终都会统一到SLF4J,再由Logback处理!🎯

2. 默认日志格式

Spring Boot默认的日志输出格式是这样的:

2023-03-15 14:30:45.123  INFO 12345 --- [  main] com.example.MyClass  : 这是一条日志信息

分解一下各部分含义:

  • 2023-03-15 14:30:45.123:时间戳⏰
  • INFO:日志级别📊
  • 12345:进程ID🆔
  • [main]:线程名🧵
  • com.example.MyClass:类名📦
  • 这是一条日志信息:日志内容📝

3. 默认日志级别

Spring Boot默认的日志级别是INFO,也就是说:

  • DEBUG🔍:不会输出
  • INFOℹ️:会输出
  • WARN⚠️:会输出
  • ERROR❌:会输出

四、自定义日志配置

虽然Spring Boot提供了合理的默认配置,但我们通常需要根据自己的需求进行调整。🛠️

1. 通过application.properties/yml配置

最简单的配置方式是在application.propertiesapplication.yml中设置:

# 设置全局日志级别
logging.level.root=WARN# 设置特定包的日志级别
logging.level.com.example=DEBUG# 输出到文件 (默认在项目根目录生成spring.log)
logging.file.name=myapp.log# 或者指定日志目录 (会在该目录下生成spring.log)
logging.file.path=/var/log# 自定义日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

2. 使用logback-spring.xml高级配置

对于更复杂的配置,可以创建logback-spring.xml文件放在src/main/resources目录下:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%nlogs/myapp.loglogs/myapp-%d{yyyy-MM-dd}.%i.log10MB301GB%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

这个配置文件做了以下事情:

  1. 定义了一个控制台输出器(CONSOLE)🎮
  2. 定义了一个文件输出器(FILE)📁,可以按日期和大小滚动
  3. 设置了全局日志级别为INFO📊
  4. 为com.example包设置了DEBUG级别🔍
  5. 降低了Spring框架的日志级别

3. 使用Spring Profile特定配置

Logback支持根据不同的Spring Profile使用不同的配置:

这样,在开发环境可以看到更详细的日志,而在生产环境则只记录重要信息。👨‍💻

五、日志级别详解

日志级别就像是信息的"紧急程度"🚨,不同级别用于不同场景:

级别描述使用场景
TRACE最详细的跟踪信息开发时追踪程序每一步执行
DEBUG调试信息开发阶段排查问题
INFO重要的运行信息生产环境记录应用程序运行状态
WARN潜在的问题,但不影响程序运行不推荐的做法、即将过期的API使用等
ERROR错误信息,影响部分功能捕获的异常、业务逻辑错误等
FATAL严重错误,导致应用程序退出系统崩溃、无法恢复的错误

最佳实践🎯:

  • 开发环境:使用DEBUG级别
  • 测试环境:使用INFO级别
  • 生产环境:使用WARN或ERROR级别

六、日志使用技巧

1. 正确的日志记录方式

不好的写法❌:

logger.info("用户ID: " + userId + " 购买了商品: " + productId);

好的写法✅:

logger.info("用户ID: {} 购买了商品: {}", userId, productId);

使用占位符{}的好处:

  1. 性能更好⚡:只有当日志级别满足时才会拼接字符串
  2. 可读性更强👀:日志格式更清晰
  3. 避免NPE🚫:自动处理null值

2. 异常日志记录

不好的写法❌:

try {// 一些代码
} catch (Exception e) {logger.error("发生错误了");
}

好的写法✅:

try {// 一些代码
} catch (Exception e) {logger.error("处理用户订单时发生错误, 用户ID: {}", userId, e);
}

记录异常时:

  1. 要包含上下文信息🧐(如用户ID、订单号等)
  2. 要把异常对象作为最后一个参数传入
  3. 避免只打印e.getMessage(),会丢失堆栈信息

3. 避免过度日志

日志不是越多越好,过多的日志会:

  1. 影响性能🐢
  2. 占用磁盘空间💾
  3. 增加排查问题的难度🤯

应该记录✅:

  • 重要的业务操作
  • 异常情况
  • 关键决策点

不应该记录❌:

  • 循环内部的详细处理
  • 敏感信息(密码、密钥等)
  • 无关紧要的调试信息

七、高级日志功能

1. MDC (Mapped Diagnostic Context)

MDC就像是一个"日志的上下文背包"🎒,可以在处理一个请求期间存储一些信息,然后在日志中输出:

// 在处理请求开始时
MDC.put("requestId", UUID.randomUUID().toString());
MDC.put("userId", getCurrentUserId());// 在日志配置中
%d{yyyy-MM-dd} [%X{requestId}] [%X{userId}] %msg%n// 在处理请求结束时
MDC.clear();

这样,同一个请求的所有日志都会带上相同的requestId和userId,方便追踪!🔍

2. 日志过滤

有时候我们想过滤掉一些不重要的日志,可以自定义过滤器:

INFO%msg%n

这个过滤器会只允许INFO及以上级别的日志输出。

3. 异步日志

为了减少日志对主业务的影响,可以使用异步日志:

5120

配置说明:

  • queueSize:队列大小,默认为256
  • discardingThreshold:当队列剩余容量小于这个值时,丢弃TRACE、DEBUG和INFO级别的日志
  • appender-ref:引用的实际appender

八、常见问题与解决方案

1. 日志冲突问题

如果你的项目依赖的库使用了不同的日志框架,可能会出现冲突。Spring Boot已经帮我们解决了大部分问题,但如果遇到冲突:

  1. 使用mvn dependency:tree查看依赖树🌳
  2. 排除冲突的日志依赖:
some.groupsome-artifactcommons-loggingcommons-logging

2. 日志文件过大

解决方案:

  1. 配置合理的滚动策略(如前文示例)
  2. 定期清理旧日志
  3. 使用totalSizeCap限制日志总大小

3. 性能问题

如果日志影响性能:

  1. 使用异步日志
  2. 适当提高日志级别
  3. 减少不必要的日志输出
  4. 使用更高效的日志格式

九、Spring Boot日志最佳实践

根据我的经验,总结了一些Spring Boot日志的最佳实践:🏆

  1. 合理分级:生产环境用WARN/ERROR,开发环境用DEBUG
  2. 统一格式:团队使用相同的日志格式
  3. 关键信息:记录请求ID、用户ID等关键信息
  4. 异常处理:总是记录完整的异常堆栈
  5. 避免敏感信息:不要记录密码、密钥等
  6. 定期审查:定期检查日志配置和日志内容
  7. 监控报警:对ERROR日志设置报警
  8. 日志归档:配置合理的日志滚动和归档策略

十、总结

Spring Boot的日志系统看似简单,实则功能强大!💪 通过本文,你应该已经掌握了:

  1. SLF4J和Logback的基本概念和关系🤝
  2. Spring Boot默认日志配置和使用方法⚙️
  3. 如何自定义日志配置🎨
  4. 日志级别和使用技巧🎯
  5. 高级功能和常见问题解决方案🔧

记住,好的日志习惯是成为优秀开发者的重要一步!👨‍💻 下次写日志时,想想这篇文章,让你的日志更加专业和有用!😊

如果你有任何问题或建议,欢迎在评论区留言!💬 我会尽力解答!Happy logging! 🎉

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

相关文章:

Spring Boot日志系统详解:Logback与SLF4J的默认集成

大家好呀!👋 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统! 一、日志系统的重要性 首先,咱们得明白为什么日志这么重要?🤷‍♂️ 想象一下,你正在玩一个超级复…...

基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程

Ai象棋是一款自动识别棋盘并分析下棋局势的工具,它能够自动化操作,帮助用户学习象棋知识。该软件无限制使用、界面无广告简洁,并提供永久授权。数据库中挑选1到2个即可完全满足使用需求,不必全部下载,解压mt管理器即可…...

刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程

2025年4月18日,大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命:聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措,无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可,也预示着共工…...

学习型组织与系统思考

真正的学习型组织不是只关注个人的学习,而是关注整个系统的学习。—彼得圣吉 在这两年里,越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师,进而在公司内部进行教学。我非常理解企业这样做的动机,毕竟内部讲师…...

mysql中优先使用datetime存储时间

基于大模型的问答进行了记录。 对为甚timestamp不如datetime好用做了深入了解,再此记录 范围广 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ 而 timestamp 仅支持’1970-01-01 00:00:01’ 到 ‘2038-01-19 03:14:07’ UTC, 存在2038年问题, 不适合长期存…...

【Linux】深入理解Linux文件系统:从C接口到内核设计哲学

文章目录 前言一、C语言中的文件接口1. 文件指针(句柄)FILE*以写方式打开文件,若文件不存在会新建一个文件W写入方式,在打开文件之前都会将文件内容全部清空追加写方式,其用法与写方法一致,不同在于a方法可…...

前端零基础入门到上班:Day7——表单系统实战全解析

🧩前端零基础入门到上班:Day7——表单系统实战全解析 ✅ 目标:不仅掌握 HTML 表单标签,更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动,为后续接入 Vue、后端接口打下坚实基础。 🌟 一、HTML 表…...

阀门轴承电动车工件一键精修软件

若需定制开发“ComfyUI意见精修软件” 技术栈建议: 前端:React/Vue Figma插件API(直接读取设计稿)。 后端:Node.js/Python NLP库(spaCy/NLTK)。 数据库:MongoDB(存储…...

【疑难杂症】【VS Code】VS Code连接不上远程服务器

【疑难杂症】【VS Code】VS Code连接不上远程服务器 经过多轮资料查询和测试,这种时候有三种可能: 可能原因1:服务器磁盘空间不足,无法创建服务器连接。 解决方案:清理磁盘空间,尤其是/tmp文件所在的磁盘。…...

Word 中“母版页”的等效机制

Word 和 PowerPoint 不太一样——**Word 实际上没有像 PowerPoint 那样的“母版页(Master Page)”**功能。但它有1个和“母版页”功能类似的东西,可能造成你看到的“校徽自动出现在每一页”的现象: ✅ Word 中“母版页”的等效机制…...

大模型时代:AI应用的变革与挑战

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...

C++ (菱形继承,通用接口 ,多态介绍)

菱形继承 class A{public :int a;};class B:public A{};class C:public A{};class D:public B,public C{public:void function(){a200;} };int main(){D object;// object.a100; 如果如此使用会产生报错 会导致一个成员在类D中出现两次,产生歧义,浪…...

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件内加入以下内容: const env dotenv.config({ path: ./.env }).parsed define: { // 将…...

4.18日学习--引用

引用是变量的别名&#xff0c;它为已存在的变量提供了一个新的名称&#xff0c;对引用的操作实际上就是对其所引用变量的操作。引用在定义时必须初始化&#xff0c;且一旦初始化后就不能再引用其他变量。 #include <iostream> using namespace std;//引用做函数的返回值…...

poj1067 取石子游戏 威佐夫博弈

题目 有两堆石子&#xff0c;数量任意&#xff0c;可以不同。游戏开始由两个人轮流取石子。游戏规定&#xff0c;每次有两种不同的取法&#xff0c; 一是可以在任意的一堆中取走任意多的石子&#xff1b;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者…...

文件二进制读写和文本读写以及编码解码

假如是utf8编码&#xff0c;windows系统 写&#xff1a;往键盘中写的字符会被utf8编码成字节写入文件。假如是文本写&#xff0c;\n会被替换为\r\n写入&#xff0c;结尾会加文件结束符EOF。假如是二进制写&#xff0c;\n就是\n&#xff0c;文件结尾也不会加什么EOF 读&#xff…...

Java学习手册:常见并发问题及解决方案

在Java并发编程中&#xff0c;开发者常常会遇到各种并发问题&#xff0c;这些问题可能导致程序行为不可预测、性能下降甚至程序崩溃。以下是一些常见的并发问题及其解决方案&#xff1a; 1.竞态条件&#xff08;Race Condition&#xff09; 竞态条件是指多个线程同时访问共享…...

幽灵依赖与常见依赖管理

文章目录 前言1. 演示&#xff1a;检测和修复幽灵依赖步骤1&#xff1a;安装 depcheck步骤2&#xff1a;在项目根目录运行 depcheck可能的输出步骤3&#xff1a;修复幽灵依赖 2. 依赖管理的好习惯 1. 场景设定现在有如下依赖需求&#xff1a; 2. 依赖冲突的表现3. 解决依赖冲突…...

第T7周:咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 VGG 网络优缺点分析&#xff1a; ● 优点&#xff1a; 结构简洁统一&#xff1a;整张网络结构统一&#xff0c;只使用 33 的小卷积核和 22 的最大池化&…...

【MySQL数据库入门到精通】

文章目录 一、SQL分类二、DDL-数据库操作1.查询2.创建数据库3.删除数据库4.使用数据库 三、DDL-表操作1.查询 一、SQL分类 根据功能主要分为DDL DML DQL DCL DDL:Date Definition Language数据定义语言&#xff1a;定义数据库&#xff0c;表和字段 DML:Date Manipulatin Lan…...

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…...

4.6 实现重定向

本实战通过ServletDemo09类演示了Servlet中的重定向功能。该Servlet通过HttpServletResponse的sendRedirect方法实现页面跳转。在doPost方法中&#xff0c;根据请求参数username和password判断用户身份。若用户名为admin且密码为123456&#xff0c;则调用sendRedirect方法将页面…...

Linux中的管道

管道的概念 管道是一种进程间通信的方式。 管道是一种半双工通信机制&#xff0c;数据只能读或写&#xff0c;如果要读写同时进行就要创建两个管道 管道的类型 1、匿名管道PIPE&#xff1a;通常在亲缘进程中使用&#xff08;兄弟、父子&#xff09; 函数参考&#xff1a;匿名管…...

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异&#xff0c;如何量化&#xff1f; 计算真实概论分布P信息量 和 估计概论分布为Q&#xff0c;但实际概率分布为P时信息量的差值 那么设&#xff0c;概率分…...

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)

一、每个阶段的 UAV—架构革新与限制突破 在 Microsoft Direct3D 11 中&#xff0c;计算着色器 (UAV) 的无序访问视图数限制为 8 个&#xff0c; (像素着色器) RTV) UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中&#xff0c;可绑定的数量已增加。 对于 DirectCompute&a…...

机械臂速成小指南(二十五):机械臂与人工智能的有机结合

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在我的主页中寻找哦&#x1f916;&#x1f63d;&#x1f984; ​ ​指南目录&#x1f4d6;&#xff1a; &#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&…...

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…...

Git学习之路(Updating)

常用命令 pwd &#xff1a;显示当前目录 git init: 在当前目录下创建一个新的仓库&#xff08;空的&#xff09; git add name.type&#xff1a;将文件添加到仓库 git commit -m "xx备注xx" &#xff1a;把文件提交到仓库。git commit一次可以提交很多文件。 git …...

【datawhaleAI春训营第一期笔记】AI+航空安全

记录了一些数据竞赛相关的知识&#xff0c;赛题的代码相关笔记可以从目录寻找 目录 数据竞赛知识前置知识TPOP竞赛分类&#xff1a; 机器学习基础线性模型树模型KNN模型神经网络 深度学习全连接网络深度学习正则化深度学习的优化卷积神经网络 竞赛基础知识数据清洗特征工程模型…...

pnpm解决幽灵依赖问题

文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗&#xff1f;2. pnpm 解决了幽灵依赖问题吗&#xff1f;3. pnpm 是如何解决的&#xff1f;举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1&#xff1a;初始化项目并安装依赖步骤2&#xf…...

梯度下降代码

整体流程 数据预处理:标准化->加一列全为1的偏置项 训练:梯度下降,将数学公式转换成代码 预测 模型代码 import numpy as np# 标准化函数&#xff1a;对特征做均值-方差标准化 # 返回标准化后的特征、新数据的均值和标准差&#xff0c;用于后续预测def standard(feats…...

七、LangChain Tool类参数对接机制解析:基于Pydantic的类型安全与流程实现

LangChain 的 Tool 类(包括 BaseTool 和 StructuredTool)通过 参数校验、输入解析、函数调用 的流程,将外部函数与 Agent 的逻辑对接。以下是其内部逻辑的详细解析: 1. 工具与函数对接的核心机制 (1) 工具的定义方式 LangChain 提供了两种主要方式定义工具: 继承 BaseTo…...

AIGC产品如何平衡用户体验与内容安全?

当ChatGPT能写诗、Sora会拍电影、AI主播24小时带货时&#xff0c;一场关于“AI说什么”的隐形战争&#xff0c;正在算法与监管的夹缝中悄然爆发。 从DeepSeek的冲击到多模态技术的祛魅&#xff0c;AIGC正在重塑内容创作的边界。但同时&#xff0c;诸多质疑也正在发声&#xff…...

uniapp打包报错,

######错误解决方案###### 错误描述&#xff1a; Android minSdkVersion配置问题 解决方案&#xff1a; 项目中配置的Android minSdkVersion比三方库中声明的minSdkVersion低&#xff0c;参考文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/app-android-minsdkversion…...

PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 PC主板及CPU ID 信息物理 MAC地址获取win11 新电脑 wmic 安装❤️ 欢迎一起学AI…...

2025妈妈杯数学建模D题完整分析论文

问题1的解题思路围绕建立货量预测模型以预测未来1天各线路货量&#xff0c;并将货量拆解到10分钟颗粒度展开。首先需要对数据进行预处理&#xff0c;读取四个Excel文件&#xff08;附件1、附件3、附件4、附件5&#xff09;&#xff0c;获取各文件中工作表名称&#xff0c;发现均…...

python-图片分割

图片分割是图像处理中的一个重要任务&#xff0c;它的目标是将图像划分为多个区域或者对象&#xff0c;例如分割出物体、前景背景或特定的部分。在 Python 中&#xff0c;常用的图片分割方法包括传统的图像处理技术&#xff08;例如阈值分割、区域生长等&#xff09;和深度学习…...

AI——K近邻算法

文章目录 一、什么是K近邻算法二、KNN算法流程总结三、Scikit-learn工具1、安装2、导入3、简单使用 三、距离度量1、欧式距离2、曼哈顿距离3、切比雪夫距离4、闵可夫斯基距离5、K值的选择6、KD树 一、什么是K近邻算法 如果一个样本在特征空间中的k个最相似&#xff08;即特征空…...

Transformer 架构 - 编码器 (Transformer Architecture - Encoder)

1.Transformer 编码器整体结构 Transformer 编码器的结构相对直观:它由 N 个完全相同的编码器层 (Encoder Layer) 堆叠而成。 图1: Transformer 编码器整体结构示意图 (简化) 输入序列(例如,通过 embedding 层转换后的词向量)首先会加上位置编码,然后传入第一个编码器层…...

深入理解 Transformer:从原理解析到文本生成实践

学习目标&#xff1a; 完成本教程后&#xff0c;学习者应该能够&#xff1a; 理解 Transformer 架构的核心思想&#xff0c;尤其是自注意力机制 (Self-Attention)。掌握 Transformer 编码器 (Encoder) 和解码器 (Decoder) 的内部结构和工作原理。理解位置编码 (Positional Enc…...

使用MetaGPT 创建智能体(2)多智能体

先给上个文章使用MetaGPT 创建智能体&#xff08;1&#xff09;入门打个补丁&#xff1a; 补丁1&#xff1a; MeteGTP中Role和Action的关联和区别&#xff1f;这是这两天再使用MetaGPT时候心中的疑问&#xff0c;这里做个记录 Role&#xff08;角色&#xff09;和 Action&…...

数据结构学习笔记 :树与二叉树详解

目录 树的基本概念二叉树的定义与特性二叉树的存储结构 3.1 顺序存储 3.2 链式存储二叉树遍历特殊二叉树类型总结与应用场景 一、树的基本概念 核心定义 树&#xff1a;由根节点和若干子树构成的层次结构。叶子节点&#xff08;终端节点&#xff09;&#xff1a;没有子节点的…...

基于大模型的直肠息肉诊疗全流程风险预测与方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理简介 2.2 大模型在医疗领域应用现状 三、直肠息肉术前预测与准备 3.1 基于大模型的术前风险预测 3.1.1 息肉性质预测 3.1.2 手术难度预测 3.2 基于预测结果的术前准备 3.…...

Python作业4 文本词云统计,生成词云

编写程序&#xff0c;统计两会政府工作报告热词频率&#xff0c;并生成词云。 2025两会政府工作报告 import jieba import wordcloud from collections import Counter import re# 读取文件 with open("gov.txt", "r", encoding"gbk") as f:t …...

AI绘制流程图,方法概述

1 deepseek 生成图片的mermaid格式代码&#xff0c;在kimi中进行绘图或在jupter notebook中绘制&#xff1a; 或在draw.io中进行绘制&#xff08;mermaid代码&#xff09; 2 svg是矢量图&#xff0c;可以插入到word """mermaid graph TDA[基线解算] --> B[北…...

Netlink套接字

netlink套接字 Netlink套接字是专门用于用户控件与内核之间的通讯&#xff0c;尤其是监听uevent事件(热插拔&#xff0c;模块加载等)&#xff1b; socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT); AF_NETLINK&#xff1a;Netlink协议族 SOCK_DGRAM…...

settimeout和setinterval区别

1. setTimeout&#xff1a;单次延迟执行 语法&#xff1a; const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能&#xff1a;在指定的 delay&#xff08;毫秒&#xff09;后&#xff0c;执行一次 callback 函数。 参数&#xff1a; callback&#x…...

在排序数组中查找元素的第一个和最后一个位置--LeetCode

题目 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 示例 1&#xff1a; 输入&#xff1a;nums [5,7,7,8,8,10], target 8输出&#x…...