说到 Node.js 的日志管理,“轮转”是个绕不开的话题——生产环境跑久了,日志文件越堆越大,不光占磁盘,查问题也费劲。在 Ubuntu 上,处理这事儿其实比想象中简单,这里分享两种主流的做法,一个走系统工具路线,另一个靠 Node.js 自带的库搞定。

方法一:用 logrotate 工具
logrotate 是 Linux 自带的日志管家,专门负责轮转、压缩、清理这些脏活累活,不需要在应用层面改代码。
安装
logrotate(如果系统里没有的话):sudo apt-get update sudo apt-get install logrotate为你的 Node.js 应用创建一个配置文件,放在
/etc/logrotate.d/下面。比如叫myapp:sudo nano /etc/logrotate.d/myapp写入以下配置:
/path/to/your/nodejs/app/logs/*.log { daily rotate 7 compress delaycompress missingok notifempty create 640 root adm }daily:每天轮转一次。rotate 7:保留最近 7 个轮转后的日志文件。compress:把旧的日志文件压缩成 gz 格式。delaycompress:这次不急着压缩,等下次轮转时再压缩。missingok:日志文件如果不在了,不报错,跳过就是。notifempty:空的日志文件不轮转,省事儿。create 640 root adm:轮转后新建日志文件,权限设为 640,属主 root,属组 adm。
手动测试一下配置是否有效:
sudo logrotate -f /etc/logrotate.d/myapp
方法二:用 Node.js 日志库自带的轮转功能
如果项目里已经用了 winston、pino 这类日志库,那就不用额外折腾系统工具了——这些库通常内置了轮转支持,配置起来更灵活。
拿 winston 举个例子:
安装
winston和winston-daily-rotate-file:npm install winston winston-daily-rotate-file在代码里配置一个按天轮转的 transport:
const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const transport = new DailyRotateFile({ filename: 'application-%DATE%.log', datePattern: 'YYYY-MM-DD-HH', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [transport] }); logger.info('Hello, world!');这段配置会按小时生成日志文件(
datePattern里用到了 HH),自动压缩旧文件,单个文件超过 20MB 也会触发轮转,保留最近 14 天的日志。
两种方法各有侧重:logrotate 是最通用、最省事的方案,只要指定日志路径就能跑,跟具体用什么语言、什么框架无关;而 winston-daily-rotate-file 这类库则让轮转逻辑跟应用代码紧密结合,方便按需定制文件名、大小、保留天数等细节。根据实际场景选一个就行,没必要两套都上。