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

NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
NestJS(一)Docker入门
NestJS(二)NestJS——创建项目、编写User模块
NestJS(三)TypeScript入门
NestJS(四)编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO
NestJS(五)NestJS——多环境配置方案(dotenv、config、@nestjs/config、joi配置校验)
NestJS(六)NestJS——使用TypeORM连接MySQL数据库(Docker拉取镜像、多环境适配)
NestJS(七)NestJS——使用TypeORM操作数据库、增删改查、关联查询、QueryBuilder

文章目录

    • 日志
      • 日志等级
      • 功能分类日志
      • 日志记录位置
    • NestJS - logger
    • 第三方日志模块(pino VS winston)
      • pino
      • winston
    • 全局异常过滤器
    • 总结

日志

日志等级

  • Log:通用日志,按需记录
  • Warning:警告日志,比如:尝试多次进行数据库操作
  • Error:严重日志,比如:数据库异常
  • Debug:调试日志,比如:加载数据日志
  • Verbose:详细日志,所有的操作与详细信息(非必要不打印)

功能分类日志

  • 错误日志:方便定位问题,给用户友好的提示
  • 调试日志:方便开发
  • 请求日志:记录敏感行为

日志记录位置

  • 控制台日志:方便监看(调试用)
  • 文件日志:方便回溯与追踪(24小时滚动)
  • 数据库日志:敏感操作、敏感数据记录

在这里插入图片描述

NestJS - logger

GitHub 提交记录

接下来,我们使用 @nestjs/common 中的 logger 来进行简单的日志打印。

修改 app.module.tslogging: false,以关闭 typeorm 的日志。

main.ts 中修改代码如下。

import { NestFactory } from "@nestjs/core"; // 导入 NestFactory,用于创建 Nest 应用实例
import { AppModule } from "./app.module"; // 导入应用的根模块
import { Logger } from "@nestjs/common"; // 导入 Logger,用于日志记录/*** 应用程序的入口文件* - 使用 NestFactory 创建应用实例* - 配置全局设置并启动应用*/
async function bootstrap() {const logger = new Logger(); // 创建 Logger 实例,用于记录日志// 创建应用实例,并可选配置日志级别const app = await NestFactory.create(AppModule, {// 日志级别配置(可选)// logger: ["error", "warn"], // 仅记录错误和警告日志});// 设置全局路由前缀app.setGlobalPrefix("api"); // 所有路由将以 "api" 为前缀,例如 /api/userconst port = 3000; // 定义应用监听的端口号// 启动应用并监听指定端口await app.listen(port);// 使用 Logger 记录应用启动信息logger.log(`App运行在:${port}`); // 普通日志logger.warn(`App运行在:${port}`); // 警告日志logger.error(`App运行在:${port}`); // 错误日志
}// 启动应用
bootstrap();

在这里插入图片描述

GitHub 提交记录

在模块中使用 logger 也非常简单。接下来,我们修改 user.controller.ts 文件,以下是主要修改内容。

@Controller("user") // 定义控制器的路由前缀为 "user"
export class UserController {private logger = new Logger(UserController.name); // 创建 Logger 实例,用于记录日志/*** 构造函数* - 注入用户服务* @param userService 用户服务*/constructor(private userService: UserService) {this.logger.log("UserController initialized"); // 控制器初始化时记录日志}/*** 获取所有用户* - 路由:GET /user/getAll* @returns 所有用户的列表*/@Get("getAll")getUsers(): any {this.logger.log("请求 getAll 成功"); // 记录获取所有用户的日志return this.userService.findAll(); // 调用服务层方法查询所有用户}
}

在这里插入图片描述


第三方日志模块(pino VS winston)

pino

pinio官网

// 安装 pino
pnpm install nestjs-pino// 安装 pino-pretty 便于直观显示
pnpm i pino-pretty// 安装 pino-roll,日志文件滚动
pnpm i pino-roll 

GitHub 提交记录

app.module.ts 中添加对日志模块的配置

import { LoggerModule } from "nestjs-pino";
import { join } from "path";...// 配置日志模块LoggerModule.forRoot({pinoHttp: {transport: {targets: [process.env.NODE_ENV === "development"? {level: "info", // 日志级别为 infotarget: "pino-pretty", // 使用 pino-pretty 格式化日志options: {colorize: true, // 启用日志颜色},}: {level: "info", // 日志级别为 infotarget: "pino-roll", // 使用 pino-roll 将日志写入文件options: {file: join("log", "log.txt"), // 日志文件路径frequency: "daily", // 日志文件按天滚动size: "10M", // 每个日志文件的最大大小为 10MBmkdir: true, // 如果目录不存在,则自动创建},},],},},}),...

修改 user.controller.ts 中对 pino 的使用。

import { Controller, Get, Post } from "@nestjs/common"; // 导入控制器和 HTTP 请求装饰器
import { UserService } from "./user.service"; // 导入用户服务
import { User } from "./user.entity"; // 导入用户实体
import { Logger } from "nestjs-pino";@Controller("user") // 定义控制器的路由前缀为 "user"
export class UserController {/*** 构造函数* - 注入用户服务* @param userService 用户服务*/constructor(private userService: UserService,private logger: Logger) {this.logger.log("UserController initialized"); // 控制器初始化时记录日志}/*** 获取所有用户* - 路由:GET /user/getAll* @returns 所有用户的列表*/@Get("getAll")getUsers(): any {return this.userService.findAll(); // 调用服务层方法查询所有用户}
}

这样,我们在访问 getAll() 请求时即可在控制台看到相关信息的打印。

在这里插入图片描述

与此同时,log 信息写入了 log 文件夹的 log.txt.1 中。

在这里插入图片描述


winston

winston官网
nest-winston网址

安装 winston 和 nest-winston。

pnpm i --save nest-winston winston// 安装日志滚动 -第三方库
pnpm install winston-daily-rotate-file

GitHub 提交记录

main.ts 中添加对 winston 的配置

import { NestFactory } from "@nestjs/core"; // 导入 NestFactory,用于创建 Nest 应用实例
import { AppModule } from "./app.module"; // 导入应用的根模块
import { createLogger } from "winston";
import * as winston from "winston";
import { utilities, WinstonModule } from "nest-winston"; // 导入 nest-winston,用于 Nest 集成 Winston 日志库}
import "winston-daily-rotate-file"; // 导入 Winston 日志轮转文件传输器/*** 应用程序的入口文件* - 使用 NestFactory 创建应用实例* - 配置全局设置并启动应用*/
async function bootstrap() {// 创建 Winston 日志实例const instance = createLogger({transports: [// 配置控制台日志输出new winston.transports.Console({level: "info", // 日志级别为 infoformat: winston.format.combine(winston.format.timestamp(), // 添加时间戳utilities.format.nestLike() // 格式化日志为 Nest 风格),}),// 配置日志文件轮转(警告级别)new winston.transports.DailyRotateFile({level: "warn", // 日志级别为 warndirname: "logs", // 日志文件存储目录filename: "application-%DATE%.log", // 日志文件名,包含日期占位符datePattern: "YYYY-MM-DD-HH", // 日期格式zippedArchive: true, // 启用压缩存档maxSize: "20m", // 每个日志文件的最大大小为 20MBmaxFiles: "14d", // 保留日志文件的天数为 14 天format: winston.format.combine(winston.format.timestamp(), // 添加时间戳winston.format.simple() // 简单格式化日志),}),// 配置日志文件轮转(信息级别)new winston.transports.DailyRotateFile({level: "info", // 日志级别为 infodirname: "logs", // 日志文件存储目录filename: "info-%DATE%.log", // 日志文件名,包含日期占位符datePattern: "YYYY-MM-DD-HH", // 日期格式zippedArchive: true, // 启用压缩存档maxSize: "20m", // 每个日志文件的最大大小为 20MBmaxFiles: "14d", // 保留日志文件的天数为 14 天format: winston.format.combine(winston.format.timestamp(), // 添加时间戳winston.format.simple() // 简单格式化日志),}),],});// 创建应用实例,并可选配置日志级别const app = await NestFactory.create(AppModule, {// 日志级别配置(可选)// logger: ["error", "warn"], // 仅记录错误和警告日志logger: WinstonModule.createLogger({instance,}),});// 设置全局路由前缀app.setGlobalPrefix("api"); // 所有路由将以 "api" 为前缀,例如 /api/userconst port = 3000; // 定义应用监听的端口号// 启动应用并监听指定端口await app.listen(port);// 使用 Winston 记录应用启动信息instance.info(`应用已启动,监听端口:${port}`);
}// 启动应用
bootstrap();

修改 app.module.ts,提供全局 Logger

import { Global, Logger, Module } from "@nestjs/common";@Global() // 声明为全局模块,所有其他模块均可直接注入
@Module({...providers: [Logger], // 服务提供者exports: [Logger], // 导出 Logger 以供其他模块使用
})

user.controller.ts 中测试使用

import { Controller, Get, Logger, Post } from "@nestjs/common"; // 导入控制器和 HTTP 请求装饰器
import { UserService } from "./user.service"; // 导入用户服务
import { User } from "./user.entity"; // 导入用户实体
/*** 用户控制器类* - 定义与用户相关的 HTTP 路由和处理逻辑* - 使用 `UserService` 提供的业务逻辑操作用户数据*/
@Controller("user") // 定义控制器的路由前缀为 "user"
export class UserController {// private logger = new Logger(UserController.name); // 创建 Logger 实例,用于记录日志/*** 构造函数* - 注入用户服务* @param userService 用户服务*/constructor(private userService: UserService,private readonly logger: Logger // 注入日志服务) {this.logger.log("UserController initialized"); // 控制器初始化时记录日志}/*** 获取所有用户* - 路由:GET /user/getAll* @returns 所有用户的列表*/@Get("getAll")getUsers(): any {this.logger.log("Fetching all users"); // 记录获取所有用户的日志this.logger.warn("Fetching all users");this.logger.error("Fetching all users");return this.userService.findAll(); // 调用服务层方法查询所有用户}
}

在这里插入图片描述

在这里插入图片描述


全局异常过滤器

GitHub 提交记录

修改 user.controller.ts,给 getAll 接口设置 http 异常处理。

  @Get("getAll")getUsers(): any {const user = { isAdmin: false };if (!user.isAdmin) {throw new HttpException("User is not admin", HttpStatus.FORBIDDEN);}this.logger.log("Fetching all users"); // 记录获取所有用户的日志this.logger.warn("Fetching all users");this.logger.error("Fetching all users");return this.userService.findAll(); // 调用服务层方法查询所有用户}

那么我们在访问 http://localhost:3000/api/user/getAll 网址的时候将在控制台看到如下日志信息。

在这里插入图片描述

src 目录下创建 filters 文件,并在该文件下创建 http-exception-filer.ts 文件,封装它为全局的 Http 异常过滤器。

import {ArgumentsHost,Catch,ExceptionFilter,HttpException,LoggerService,
} from "@nestjs/common"; // 导入相关装饰器和类型/*** 自定义 HTTP 异常过滤器* - 捕获所有 `HttpException` 类型的异常* - 记录异常日志并返回标准化的响应*/
@Catch(HttpException) // 捕获 HttpException 类型的异常
export class HttpExceptionFilter implements ExceptionFilter {/*** 构造函数* - 注入日志服务,用于记录异常日志* @param logger 日志服务*/constructor(private logger: LoggerService) {}/*** 异常捕获处理方法* - 捕获异常并返回标准化的响应* @param exception 捕获的异常对象* @param host 参数上下文*/catch(exception: HttpException, host: ArgumentsHost) {const ctx = host.switchToHttp(); // 获取 HTTP 上下文const response = ctx.getResponse(); // 获取响应对象const request = ctx.getRequest(); // 获取请求对象const status = exception.getStatus(); // 获取异常状态码// 使用日志服务记录错误信息this.logger.error(exception.message, exception.stack);// 返回标准化的 JSON 响应response.status(status).json({code: status, // HTTP 状态码timestamp: new Date().toISOString(), // 当前时间戳path: request.url, // 请求的 URLmethod: request.method, // 请求的方法(GET、POST 等)message: exception.message || exception.name, // 异常信息});}
}

main.ts 中进行全局使用。

app.useGlobalFilters(new HttpExceptionFilter(logger)); // 使用全局异常过滤器处理 HTTP 异常

此时在访问一个不存在的路由(如:http://localhost:3000/api/user/getAll123)时,即可在控制台看到如下错误。

在这里插入图片描述

此时在日志文件中也记录了相关错误日志。

在这里插入图片描述


总结

本篇文章,我们认识了日志的作用,学习了 NestJS-logger、pino日志、winston日志,并了解了如何把日志输入到文件。最后,我们学习了全局异常过滤器,它帮助我们统一处理异常的请求,并且我们还实现了和日志相结合。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. DeepSeek
  2. NestJS 从入门到实战

在这里插入图片描述

相关文章:

NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

list重点接口及模拟实现

list功能介绍 c中list是使用双向链表实现的一个容器,这个容器可以实现。插入,删除等的操作。与vector相比,vector适合尾插和尾删(vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动,时…...

Linux | mdadm 创建软 RAID

注:本文为 “Linux mdadm RAID” 相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Linux 下用 mdadm 创建软 RAID 以及避坑 喵ฅ・ﻌ・ฅ Oct 31, 2023 前言 linux 下组软 raid 用 mdadm 命令,multi…...

迁移学习:解锁AI高效学习与泛化能力的密钥

前言 在人工智能(AI)技术日新月异的今天,迁移学习(Transfer Learning)作为一项革命性技术,正深刻改变着机器学习领域的格局。 它不仅让模型能够像人类一样“举一反三”,更在加速模型开发、提升性…...

前端-HTML元素

目录 HTML标签是什么? 什么是HTML元素? HTML元素有哪些分类方法? 什么是HTML头部元素 更换路径 注:本文以leetbook为基础 HTML标签是什么? HTML标签是HTML语言中最基本单位和重要组成部分 虽然它不区分大小写&a…...

STM32之蜂鸣器和按键

一、蜂鸣器的原理与应用 基本概念 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 工作原理 蜂鸣器一般分为两类:有源…...

H3C UIS 超融合管理平台原理解读以及日常运维实操与故障处理

前言:超融合(Hyper-Converged Infrastructure, HCI)是将计算、存储、网络和虚拟化资源整合到统一硬件平台中,并通过软件定义技术实现资源池化与灵活管理的架构。H3C(新华三)和华为作为国内领先的ICT厂商&am…...

【强化学习】#5 时序差分学习

主要参考学习资料:《强化学习(第2版)》[加]Richard S.Suttion [美]Andrew G.Barto 著 文章源文件:https://github.com/INKEM/Knowledge_Base 缩写说明 DP:动态规划GPI:广义策略迭代MC:蒙特卡洛…...

Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先

Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先 236.二叉树的最近共公共祖先 236. 二叉树的最近公共祖先 - 力扣(LeetCode) 思路: 二叉树的最近公共祖先【基础算法精讲 12】_哔哩哔哩_bilibili 首先我们采用后序遍历 递归函数返回值…...

Elasticsearch 性能优化面试宝典

Elasticsearch 性能优化面试宝典 🚀 目录 设计调优 🏗️写入调优 ⚡查询调优 🔍综合设计 💎总结 📝设计调优 🏗️ 面试题1:索引设计优化 题目: 假设需要设计一个电商商品索引,日增数据量1TB,要求支持多维度查询(名称、分类、价格区间)。请说明索引设计的关…...

mysql数据库-中间件MyCat

1. MyCat简介 在整个 IT 系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如: SQL 语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分…...

制作大风车动画

这个案例的风车旋转应用了图形变换来实现,速度和缩放比例应用slider来实现,其中图片的速度,图片大小的信息通过State来定义变量管理,速度和和缩放比例的即时的值通过Prop来管理。 1. 案例效果截图 2. 案例运用到的知识点 2.1. 核…...

嘉立创EDA成图:文件管理

在 工程 文 件夹 中 新建 一 个以 自 己选 手 编号 后 8 位 命名 的 项目 工 程文 件 按要求名字命名(这里以日期命名) 选择半离线或者全离线 添加路径 1. 新建 图 纸文 件 ,文 件 名为 moban.elibz; 点击保存之后打开文件夹有这…...

Vim编辑器命令模式操作指南

Vim 的命令模式(即 Normal 模式)是 Vim 的核心操作模式,用于执行文本编辑、导航、搜索、保存等操作。以下是命令模式下的常用操作总结: 1. 模式切换 进入命令模式:在任何模式下按 Esc 键(可能需要多次按&a…...

jvm安全点(一)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理入口​​ ​​JVM_HANDLE_XXX_SIGNAL​​ 是 JVM 处理信号的统一入口,负责处理 SIGSEGV、SIGBUS 等信号。​​javaSignalHandler​​ 是实际注册到操作系统的信号处理函数,直接调用 JVM_HANDLE_XXX_SIGNAL。 ​​2. 安全点轮询页的识别​​ …...

手机打电话时由对方DTMF响应切换多级IVR语音应答(二)

手机打电话时由对方DTMF响应切换多级IVR语音应答(二) --本地AI电话机器人 一、前言 前面的篇章《手机打电话时由对方DTMF响应切换多级IVR语音应答(一)》中,我们从理论的角度论述了“根据对方按下DTMF值响应多级IVR”…...

【Java ee初阶】HTTP(2)

一、HTTP的方法 方法 说明 支持的HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道…...

计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM-Attention 一、完整代码实现二、代码结构解析三、关键数学公式四、参数调优建议五、性能优化方向六、工业部署建议 以下是用Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测的完整解决方案。该方案结合了四层信号分解技术与注意力增强的深度学习模型&#…...

Java 应用如何实现 HTTPS:加密数据传输的实用指南

Java 应用如何实现 HTTPS:加密数据传输的实用指南 在当今的互联网环境中,数据安全至关重要,HTTPS 作为加密的数据传输协议,为 Java 应用提供了安全通信的保障。本文将深入探讨 Java 应用如何实现 HTTPS,通过详细代码实…...

手机打电话时如何将通话对方的声音在手机上识别成文字

手机打电话时如何将通话对方的声音在手机上识别成文字 --本地AI电话机器人 上一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(一) 下一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(二) 一、…...

18.自动化生成知识图谱的多维度质量评估方法论

文章目录 一、结构维度评估1.1 拓扑结构评估1.1.1 基础图论指标1.1.2 层级结构指标 1.2 逻辑一致性评估1.2.1 形式逻辑验证1.2.2 约束满足度 二、语义维度评估2.1 语义一致性评估2.1.1 标签语义分析2.1.2 关系语义评估 2.2 语义表示质量2.2.1 嵌入质量2.2.2 上下文语义评估 三、…...

W5500使用ioLibrary库创建TCP客户端

1、WIZnet全硬件TCP/IP协议栈 WIZnet全硬件TCP/IP协议栈,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE协议。 以太网:支持BSD和WIZCHIP(W5500/W5300/W5200/W5100/W5100S)的SOCKET APIs驱动程序。 互联网: DHCP客户端 DNS客户端 FTP客…...

2025B难题练习

1.启动多任务排序 拓扑排序 每次选入度为0的点 对每次选的点进行排序 package mainimport ("bufio""fmt""os""slices""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)scanner.Scan()text : scanner.Text()…...

20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔

20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔 2025/5/17 17:52 缘起:实测NanoPi NEO core开发板上电之后,后插入的TF卡不认/不支持热插拔。 Ubuntu core16.04.2 Ubuntu core20.04 Ubuntu core16.04.3 用NanoPi NEO core开发板…...

Vue百日学习计划Day19-20天详细计划-Gemini版

重要提示: 番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。动手实践: DevTools 的使用和 Git 命令的掌握都需要大量的实际操作。请务必边学边练。环境准备&#xff1a…...

Uniapp、Flutter 和 React Native 全面对比

文章目录 前言Uni-app、Flutter 和 React Native 跨平台框架对比报告1. 性能对比2. 跨平台能力3. 学习曲线4. 社区生态与第三方库5. 原生能力扩展6. UI 渲染能力7. 企业支持与典型使用场景8. 开发效率与工具链 前言 将对 Uniapp、Flutter 和 React Native 进行全面对比&#x…...

【Linux笔记】——线程互斥与互斥锁的封装

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——Linux线程封装 🔖流水不争,争的是滔滔不息 一、线程互斥的概念二、互…...

Linux面试题集合(4)

现有压缩文件:a.tar.gz存在于etc目录,如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…...

Java二叉树题目练习

Java二叉题目练习 相同的树对称二叉树平衡二叉树二叉树的最近公共祖先二叉树的层序遍历二叉树层序遍历 ||二叉树遍历 相同的树 二叉树的题目大多数时候就可以采用递归的方法写 因为二叉树是由根左子树和右子树组成,每一棵左子树和右子树又可以被看成一颗完整的树&am…...

WORD个人简历单页326款模版分享下载

WORD个人简历模版下载:WORD个人简历模版https://pan.quark.cn/s/7e79a822c490...

Linux容器技术详解

容器技术基础 什么是容器 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。 Docker官网:https://www.docker…...

显卡、Cuda和pytorch兼容问题

这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…...

仅需三张照片即可生成沉浸式3D购物体验?谷歌电商3D方案全解析

随着消费者对线上购物体验的要求不断提高,传统2D图片已难以满足用户“真实感知商品”的需求。尤其在鞋类、家具、服装等高决策成本的商品上,缺乏空间感和交互性的购物方式成为转化率瓶颈。 谷歌敏锐地捕捉到这一趋势,早在2022年起便开始探索通过生成式AI技术实现“低成本、…...

PIC16F877A LCD1602 DHT11 温湿度读取显示代码 MPLAB

#include <xc.h> #include <stdio.h> #include <stdlib.h> #...

PIC16F18877 的主时钟 设置方法

#include <xc.h>// ========== 配置位设置 ========== // #pragma config FEXTOSC = OFF // 使用内部振荡器 #pragma...

西门子 Teamcenter13 Eclipse RCP 开发 1.3 工具栏 单选按钮

西门子 Teamcenter13 Eclipse RCP 开发 1.3 工具栏 单选按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮&#xff08;默…...

asp.net core api RESTful 风格控制器

在 ASP.NET Core API 中&#xff0c;遵循 RESTful 风格的控制器一般具备以下几个关键特征&#xff1a; ✅ RESTful 风格控制器的命名规范 控制器命名 使用 复数名词&#xff0c;表示资源集合&#xff0c;如 ProductsController、UsersController。 路由风格 路由使用 [Rout…...

智能合约调用全景实战:前端 JS 与后端 Java 两种方式全面解析

目录 前言前端调用以太坊合约新建一个智能合约将合约部署到Hardhat本地链前端(HTML + JavaScript)调用合约后端调用以太坊合约生成java类调用智能合约(maven 插件方式)不生成Java类,通过合约ABI直接调用智能合约前后端调用方式对比开发建议结语前言 随着 Web3 的兴起,越…...

Javascript:WebAPI

获取网页元素 queryselector queryselector是 JavaScript 中用于选择 DOM 元素的重要方法&#xff0c;它允许使用 CSS 选择器语法来查找页面中的元素。 一般queryselector获取的元素都是html中第一个选择器的元素 支持选择器类型&#xff1a;类选择器(.class) &#xff0c…...

(4)python爬虫--JsonPath

文章目录 前言一、安装JsonPath库第一步&#xff1a; 打开pycharm第二步: 安装jsonpath 二、 jsonpath的基本使用2.1 基础语法2.2 语法测试2.2.1 准备json文件(store.json)2.2.2 jsonpath解析json语法 三、实战练习需求:爬取淘票票上所有的城市3.1 下载城市json文件3.2 解析城市…...

CentOS 上配置 Docker 使用 NVIDIA GPU

CentOS 上配置 Docker 使用 NVIDIA GPU&#xff08;前提是已安装 NVIDIA 驱动&#xff09;&#xff1a; 在 CentOS 上配置 Docker 使用 NVIDIA GPU 本文介绍如何在已安装 NVIDIA 驱动的 CentOS 系统中&#xff0c;配置 Docker 使用 GPU 资源进行加速。 ✅ 前提条件 已安装 Cent…...

JAVA Spring MVC+Mybatis Spring MVC的工作流程*

目录 注解总结 将传送到客户端的数据转成json数据 **描述一下Spring MVC的工作流程** 1。属性赋值 BeanUtils.copyProperties(addUserDTO,user); 添加依赖&#xff1a; spring web、mybatis framework、mysql driver Controller和ResponseBody优化 直接改成RestControl…...

【人工智能】DeepSeek解码:揭秘AI大模型训练的创新密码

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek作为开源AI领域的先锋,以其高效、低成本的大模型训练技术震撼业界。本文深入剖析DeepSeek-V3和R1模型的训练密码,聚焦其创新的混…...

Java 方法向 Redis 里操作字符串有什么需要注意的?​

在 Java 开发中&#xff0c;Redis 作为高性能的键值存储数据库&#xff0c;常被用于缓存数据、处理高并发场景等。当我们使用 Java 方法向 Redis 中操作字符串类型数据时&#xff0c;有许多关键要点需要格外注意。这些要点不仅关系到代码的正确性和性能&#xff0c;还影响着整个…...

C#与KepOPC通讯

使用C#连接KepOPC服务器进行数据读写的基础示例 using System; using Opc; using System.Threading;namespace KepOPCDemo {class Program{static void Main(string[] args){// OPC服务器连接参数string serverName "Kepware.KEPServerEX.V6"; // 根据实际安装的服…...

【软件测试】性能测试 —— 工具篇 LoadRunner 介绍与使用

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. LoadRunner 是什么&#xff1f;2. LoadRunner 安装前提&#xff1a;浏览器的选择 —— IE / 360极速浏览器…...

Linux面试题集合(6)

创建多级目录或者同级目录 mkdir -p 文件名/文件名/文件名 mkdir -p 文件名 文件名 文件名 Linux创建一个文件 touch 文件名 DOS命令创建文件 echo 内容>文件名&#xff08;创建一个有内容的文件&#xff09; echo >文件名&#xff08;创建一个没有内容的文件&#xff09…...

技术测评:小型单文件加密工具的功能解析

最近在测试一款名为OEMexe的文件加密工具&#xff0c;发现它确实有一些独特之处值得分享。这款软件体积非常小巧&#xff0c;仅209KB&#xff0c;属于绿色单文件版程序&#xff0c;无需安装即可直接运行。 主要特点 多格式支持&#xff1a;能够处理多种常见文件格式&#xff0…...

06、基础入门-SpringBoot-依赖管理特性

06、基础入门-SpringBoot-依赖管理特性 Spring Boot 的依赖管理特性是其核心优势之一&#xff0c;极大地简化了项目的构建和维护过程。以下是其主要特点&#xff1a; ## 1. 父项目依赖管理 ### 1.1 继承 spring-boot-starter-parent 在 pom.xml 文件中&#xff0c;通过继承 spr…...

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真

基于 Python 的界面程序复现&#xff1a;标准干涉槽型设计计算及仿真 在工业设计与制造领域&#xff0c;刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序&#xff0c;旨在帮助工程师和…...