当前位置: 首页 > 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.gsyq.cn/news/1639325.html

相关文章:

  • Web安全实战:CSRF攻击原理与Token、SameSite、CORS组合防御策略
  • Altium Designer开关电源专用元件库:原理图符号+PCB封装一体化打包
  • 龍魂DNA时间轴L5分层架构 v1.4|天地人三才×原点能量场·通心翻译器·数字主权登记×一票否决·C++工程实现
  • OWASP Top 10安全漏洞深度解析:从原理到实战的Web应用防护指南
  • 蓝桥杯EDA省赛第二场真题资料包:含原理图工程、PCB文件、LMV358手册及全套试题
  • Beyond Compare 5授权机制深度解析:从加密原理到本地化激活实践
  • 智慧农业实战:基于物联网的自适应智能灌溉系统开发
  • 命运学:用算法、量化交易与深度学习解析复杂系统
  • sra_tvm_adapter:鲲鹏TVM适配器完全指南 - 如何为国产处理器优化AI推理性能
  • MATLAB+CPLEX实现家庭用电智能调度:空调与电动车在分时电价下的协同优化
  • 目前短视频评价情况
  • CAPM与Alpha策略实战:Python量化回测中分离Beta风险获取超额收益
  • 「 简记往来」第十九篇:Nginx配置与HTTPS证书——让API安全可用
  • G-Helper终极指南:如何用轻量级控制工具彻底释放华硕笔记本性能
  • Matlab一键运行TV-Retinex图像增强工具包:含SplitBregman求解器与实操视频
  • 微信天气小程序源码:15天预报+城市搜索+自动切换天气背景图
  • 跨架构物联网漏洞挖掘:统一IR与动静结合分析实践
  • PyTorch 2.0 实战:L1/L2正则化对比,MNIST分类准确率提升 3%
  • C#版YOLOv8+TensorRT实时检测与ByteTrack多目标追踪工程包(Win10/.NET 4.7.2/VS2019)
  • 5G-NR LDPC编译码MATLAB实操包:0.5码率+OMS偏置译码+全程录像指导
  • LearnOpenCV:2.3 万 Star 的计算机视觉实战代码库
  • NVIDIA Profile Inspector完整指南:解锁显卡隐藏设置的终极工具
  • 深入探索NVIDIA Profile Inspector:解锁显卡隐藏性能的秘密钥匙
  • 华硕笔记本性能控制终极指南:G-Helper轻量级工具完全教程
  • 2026-07-04 GitHub 热点项目精选
  • 从Prompt到自动化工作流:Loop Engineering构建AI编程新范式
  • 艾尔登法环mod下载法魂Modv3.0安装指南
  • 安卓蓝牙app技术-Claude
  • 空洞骑士模组管理器Scarab终极指南:如何轻松安装和管理MOD
  • MATLAB图形化图像水印工具:支持DCT/DWT嵌入提取与攻击测试