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

「 简记往来」第二十篇:日志系统设计——没有日志,出了问题只能靠猜

一、没有日志的代价

有一次,用户反馈“批量记礼功能用不了”。

我登录服务器,查了代码、查了数据库、查了网络……折腾了一个小时,才发现是MongoDB连接超时。

如果有日志,这个问题30秒就能定位。

没有日志,出了问题只能靠猜。

二、Node.js日志的基本原则

Node.js日志管理通常遵循**“应用层 + 系统层 + 运维层”三层结合的策略**。

核心原则:

  1. 使用结构化日志:采用JSON格式,便于检索和分析
  2. 分级记录:ERROR / WARN / INFO / DEBUG
  3. 包含上下文:requestId、userId、timestamp等
  4. 异步写入:不阻塞事件循环

三、日志库选型

Node.js生态推荐三个日志库:

特点适用场景
Winston功能最全、支持多传输需要多种输出方式
Pino性能最好、JSON原生高并发场景
Bunyan轻量、结构化简单应用

简记往来使用Winston

constwinston=require('winston');constlogger=winston.createLogger({level:process.env.LOG_LEVEL||'info',format:winston.format.combine(winston.format.timestamp(),winston.format.json()),transports:[newwinston.transports.File({filename:'logs/error.log',level:'error'}),newwinston.transports.File({filename:'logs/combined.log'})]});if(process.env.NODE_ENV!=='production'){logger.add(newwinston.transports.Console({format:winston.format.simple()}));}

四、日志分级

级别用途示例
ERROR系统错误,需要立即处理数据库连接失败
WARN异常但可恢复请求参数不完整,使用默认值
INFO关键业务操作用户登录、创建账本
DEBUG调试信息查询参数、中间件执行

生产环境建议将日志级别控制在WARN/ERROR,按需开启INFO/DEBUG。

五、日志格式规范

每条日志应包含:

{"timestamp":"2026-06-30T10:00:00.000Z","level":"INFO","service":"jianji-backend","requestId":"req_xxx","userId":"user_xxx","message":"用户登录成功","duration":125}

requestId是贯穿整个请求链路的唯一标识,方便追踪问题。

六、日志存储与轮转

日志文件需要定期轮转,防止磁盘占满:

constDailyRotateFile=require('winston-daily-rotate-file');consttransport=newDailyRotateFile({filename:'logs/application-%DATE%.log',datePattern:'YYYY-MM-DD',maxSize:'20m',maxFiles:'14d'});

七、总结

日志系统是运维的“眼睛”。

  • Winston/Pino记录结构化日志
  • ERROR/WARN/INFO/DEBUG分级
  • 包含requestId、userId、timestamp等上下文
  • 定期轮转,防止磁盘占满

没有日志,出了问题只能靠猜。有了日志,一切都有迹可循。

下一篇,我们来聊聊数据备份与恢复策略——数据丢了怎么办?

评论区聊聊:你的日志系统是怎么设计的?

http://www.jsqmd.com/news/1127341/

相关文章:

  • Altium Designer开关电源专用元件库:原理图符号+PCB封装一体化打包
  • AI工程化转型指南:普通开发者如何抓住大模型应用红利
  • STM32F103ZET6与Arduino Uno/Nano串口互通实测工程(含3.3V/5V电平适配)
  • 财务管理系统毕业设计实战包:SpringBoot+Vue全栈可运行源码(含MySQL脚本与傻瓜式部署指南)
  • YOLOv8检测界面源码包:PyQt5实现图片/视频/摄像头三模式实时识别与结果可视化
  • DevOps 中的 Ports 治理:从端口声明到可观测性的四层实践
  • OWASP Top 10安全漏洞深度解析:从原理到实战的Web应用防护指南
  • 山东大学编译原理PL0实验代码:Java实现的词法扫描、递归下降语法分析与P-code解释器
  • AES128-GCM加密算法详解:原理、跨平台实现与安全实践
  • 龍魂DNA时间轴L5分层架构 v1.4|天地人三才×原点能量场·通心翻译器·数字主权登记×一票否决·C++工程实现
  • 业务逻辑漏洞实战指南:从原理到防御的深度剖析
  • 蓝桥杯EDA省赛第二场真题资料包:含原理图工程、PCB文件、LMV358手册及全套试题
  • MATLAB+CPLEX实现家庭用电智能调度:空调与电动车在分时电价下的协同优化
  • 命运学:用算法、量化交易与深度学习解析复杂系统
  • 双检查锁下的单例懒汉模式
  • Beyond Compare 5授权机制深度解析:从加密原理到本地化激活实践
  • 智慧农业实战:基于物联网的自适应智能灌溉系统开发
  • sra_tvm_adapter:鲲鹏TVM适配器完全指南 - 如何为国产处理器优化AI推理性能
  • SQLFlow本地部署全栈包:中文文档+多环境安装脚本+字段级血缘可视化演示
  • 目前短视频评价情况
  • 「 简记往来」第十九篇:Nginx配置与HTTPS证书——让API安全可用
  • 用 Claude Code 一小时重构老项目 CLI 代码实战
  • ANSYS Workbench 12.1中文实操包:从建模、网格到热分析与接触设置的全套学练资源
  • CAPM与Alpha策略实战:Python量化回测中分离Beta风险获取超额收益
  • 跟踪资金流向:使用 ES|QL 和跨集群搜索追踪洗钱网络
  • Java用POI往Word里加文字和图:带全部依赖的即跑示例
  • G-Helper终极指南:如何用轻量级控制工具彻底释放华硕笔记本性能
  • Matlab一键运行TV-Retinex图像增强工具包:含SplitBregman求解器与实操视频
  • NoFuserEx命令行反混淆工具:专为还原NoFuser加壳的.NET程序设计,含dnlib依赖与调试支持文件
  • 微信积分商城小程序源码包,含全套页面逻辑、配置文件与可直接使用的图标资源