摘要
Node 后端服务日志无分级存储时,错误、正常请求、爬虫日志全部混在同一文件,线上故障排查需要检索海量文本,效率极低。本文基于 winston 封装分级日志工具,按日志级别、日期自动切割文件,压缩归档历史日志,bidfans 爬虫、前端配套 Node 服务均使用这套日志方案。
const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); // 日志格式化规则 const logFormat = winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(info => { return `[${info.timestamp}] [${info.level}] ${info.message}`; }) ); // 按日期切割配置 function createRotateTransport(level) { return new DailyRotateFile({ filename: `logs/${level}-%Y-%m-%d.log`, datePattern: 'YYYY-MM-DD', maxSize: '100m', maxFiles: '30d', zippedArchive: true, level: level }); } // 日志实例导出 const logger = winston.createLogger({ levels: winston.config.npm.levels, format: logFormat, transports: [ createRotate('info'), createRotate('warn'), createRotate('error') ] }); module.exports = logger;一、混合日志的运维缺陷
未分级日志文件中,正常商品抓取打印、接口访问、程序崩溃报错全部混杂在一起,出现爬虫大量 403 报错时,需要逐行检索数万行日志;日志无自动切割,单个文件达到数个 GB 后打开卡顿,甚至无法读取;历史日志长期占用服务器磁盘,无自动压缩清理机制。bidfans 爬虫服务每日产生大量抓取日志,未做切割前日志文件体积暴增,磁盘占用持续告警。
二、分级存储设计思路
日志分为 info、warn、error 三个独立文件:
- info:正常商品抓取、页面访问、定时任务执行等常规打印;
- warn:抓取延迟、图片加载失败等非阻断类异常;
- error:爬虫封禁、服务接口报错、文件读写失败等严重故障。 三类日志按日期拆分,每日生成全新文件,单文件上限 100MB,超出自动拆分子文件,避免单个日志文件过大。
三、自动归档与磁盘管控
开启 zippedArchive 参数,30 天前的历史日志自动压缩为 zip 包,减少磁盘占用;系统自动清理超过 30 天的压缩日志,无需人工删除。运维排查故障时,直接打开 error 日志文件,无需筛选海量正常打印,故障定位速度提升 70%。
四、业务日志分类拓展
爬虫抓取、页面接口、仓储定时任务可新增独立日志传输通道,单独输出专属日志文件,实现业务完全隔离。例如爬虫抓取日志单独存储,商品接口日志单独存放,排查抓取问题不会被页面访问日志干扰。
结语
基于 winston 的分级日志切割工具,按级别、日期拆分存储并自动压缩归档,大幅简化线上故障排查流程,降低服务器磁盘占用,适用于爬虫、中间层 Node 服务长期稳定运行场景。