NestJS 入门(10):日志——为什么常用 Winston?

发布时间:2026/10/9 7:54:38

NestJS 入门(10):日志——为什么常用 Winston? 上一篇NestJS 入门9连上数据库SQL 写在哪 讲了数据和表结构。服务跑起来之后排障靠的是日志哪次请求 401 了、登录失败是哪个 email、某次生成耗了多久。Nest 自带Logger本地够用。生产里 Node 社区最常见的是Winston分级、JSON、写文件/控制台、按天切割一套就能接上。1. 为什么不要满地console.logconsole.log(login ok,user);// 可能把 password 哈希打出来console.log(error,e);// 没有级别不好过滤console.log(newDate(),req.url);// 格式每次不一样机器搜不动问题很具体需求console.log正经日志库只要 error全混在 stdoutlevel: error按请求串起来没有统一字段带requestId给 ELK / Loki 采集自由文本难解析一行一条 JSON本地彩色、生产 JSON自己 iftransport 分开配所以目标不是「能打印」而是有级别、有结构、能按一次请求把前后日志对上。2. Nest 自带 Logger入门先会这个import{Injectable,Logger}fromnestjs/common;Injectable()exportclassAuthService{privatereadonlyloggernewLogger(AuthService.name);asynclogin(email:string,password:string){this.logger.log(login attempt:${email});this.logger.warn(invalid credentials);this.logger.error(token sign failed,err?.stack);}}第二个参数类名会出现在日志里方便看是哪个 Service 打的级别log/error/warn/debug/verbose够写业务、够看启动信息。不够的地方是默认偏给人看的文本切文件、JSON、按天轮转要自己拼。这时上 Winston。3. Winston 是干什么的Winston 本身和 Nest 无关是 Node 日志库。核心就三块logger.info(hello, { userId: 1 }) → format时间、JSON、颜色 → transports打到哪Console / File / 远程Nest 里通常用nest-winston把 Winston 接到 Nest 的LoggerService接口上这样new Logger(Xxx.name)仍能用app.useLogger(...)后框架自己的启动日志也走 Winstonnpmi winston nest-winston4. 接到 Nest最小可跑main.tsimport{WinstonModule}fromnest-winston;import*aswinstonfromwinston;asyncfunctionbootstrap(){constappawaitNestFactory.create(AppModule,{logger:WinstonModule.createLogger({level:process.env.LOG_LEVEL||info,format:winston.format.combine(winston.format.timestamp(),winston.format.json()),transports:[newwinston.transports.Console(),],}),});awaitapp.listen(3000);}生产一行会接近{level:info,message:API service running on http://localhost:3000,timestamp:2026-08-15T10:00:00.000Z,context:Bootstrap}采集端按level、message、timestamp建索引即可。本地开发若想看彩色文本Console 可以换成newwinston.transports.Console({format:winston.format.combine(winston.format.colorize(),winston.format.simple()),})本地给人看生产给机器看两个 transport 或按NODE_ENV分支即可。5. 业务里怎么打注入 Nest 的 loggernest-winston提供后仍用官方Logger最省事Injectable()exportclassUsersService{privatereadonlyloggernewLogger(UsersService.name);asyncfindByEmail(email:string){this.logger.debug(findByEmail${email});constuserawaitthis.users.findOne({where:{email}});if(!user){this.logger.warn(user not found:${email});}returnuser;}}也可以做成全局模块注入自己的封装和第六篇Global()同一套路统一带上service: apithis.logger.info(POST /api/auth/login 200,{requestId,method:POST,path:/api/auth/login,statusCode:200,durationMs:12,});字段尽量固定requestId、method、path、statusCode、durationMs、error。后面搜「这次请求慢在哪」才搜得到。6. 请求级日志Interceptor 打出入第四篇的拦截器管信封日志也可以挂一个全局 Interceptor在请求结束时打一行INFO GET /api/projects 200 durationMs35 requestId1723-ab12 ERROR POST /api/auth/login 500 durationMs8 requestId1723-cd99 error...要点进来时生成requestId或读网关的x-request-id写进req响应头带上X-Request-Id方便前端/网关对照业务日志都带上同一个requestId没有requestId时十条user not found对不上是哪次点击。7. 级别怎么用级别什么时候error失败了需要人看连库失败、未捕获异常warn不正常但还能继续校验失败、降级、token 过期info正常关键路径启动成功、请求进出可抽样debug开发细节SQL、中间变量生产默认关掉生产LOG_LEVELinfo即可。debug全开会把磁盘和费用打爆也更容易把敏感信息带出去。8. 写文件、按天切知道即可newwinston.transports.File({filename:logs/error.log,level:error}),newwinston.transports.File({filename:logs/combined.log}),Docker / K8s 里更常见的是只打 stdout JSON由平台采集应用自己不落盘。自己管文件时再加winston-daily-rotate-file按天切割、限制保留天数。入门先 Console JSON等真正部署再决定文件还是 stdout。9. 不要记进日志的东西密码、token、cookie、API Key身份证号、完整银行卡超大 body / embedding 向量登录失败打email可以打password不行。Authorization: Bearer ...不要整段进日志。10. 和「自己包一层 console」的关系有的项目不引入 Winston而是console.log(JSON.stringify({level:info,message,service:api,timestamp:newDate().toISOString(),requestId,}));结构也对采集也能吃。缺的是transport、按级别分文件、和 Nest 内置 Logger 打通、生态里现成的 rotate。小项目可以自制 JSON console要分级、切文件、统一框架日志再上 Winston。换库不换习惯级别 结构化字段 requestId。11. 小结日志要分级、要结构不要散落console.logNestLogger够入门生产常用Winston nest-winston一行 JSONlevel/message/timestamp/requestId请求进出适合全局 Interceptor业务细节打在 Service生产默认info密码和 token 永远不要进日志对照本系列分层、注入、模块、连库清楚了吗统一信封和异常 Filter 能对上日志里的 status 吗这条日志有级别吗有 requestId 吗会不会把密钥打出去系列导航上一篇NestJS 入门9连上数据库SQL 写在哪第八篇NestJS 入门8环境变量与配置第七篇NestJS 入门7生命周期钩子第六篇NestJS 入门6Module 边界与导出第五篇NestJS 入门5Pipe 与 DTO 校验第四篇NestJS 入门4统一响应与异常处理第三篇NestJS 入门3Guard 如何挡住未登录请求第二篇NestJS 入门2依赖注入到底解决了什么问题第一篇NestJS 入门1先搞懂 Module、Controller、Service
延伸阅读

更多相关文章

2026/10/7 3:10:42

2023年最值得关注的GitHub工具:Awesome GitHub年度精选榜单

2023年最值得关注的GitHub工具:Awesome GitHub年度精选榜单 【免费下载链接】awesome-github An exquisite list of awesome :octocat: secrets. 项目地址: https://gitcode.com/gh_mirrors/awesom/awesome-github GitHub作为全球最大的代码托管平台&#xf…

2026/10/9 7:49:55

老旧设备串口联网改造:RS232/RS485如何接入工业互联网

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 7:49:55

用Dify与DeepSeek搭建拍照解题工作流:OCR+提示词设计实战

1. 先说说我为什么折腾这套拍照解题起因其实挺简单。我那段时间经常要帮家里小孩看作业,从小学数学到初中物理都混着来。试过市面上一些拍照搜题App,答案倒是快,但有两件事让我很不爽:一是它只给答案不解释思路,小孩看…

2026/10/9 7:49:55

具身智能热潮背后:商业路径、技术瓶颈与产业落地

1. 热潮之下:先算一笔"鱼价"的账最近这一年,具身智能的热度已经到了让人无法忽视的地步。从一个做机器人本体、做灵巧手、做操作系统的朋友,到一级市场看项目的投资人,再到互联网大厂里研究战略的同行,几乎每…

2026/10/9 7:49:55

Filmigo 移动端视频剪辑工具|安卓短视频剪辑体验分享

简介现在短视频创作需求越来越多,很多人希望直接在手机上完成剪辑,不用电脑。Filmigo 就是一款轻量化安卓视频剪辑应用,适合自媒体新手快速制作短视频。核心功能基础剪辑:视频分割、裁剪、拼接、调速、倒放、旋转,基础…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑