在 Linux 下对 Node.js 日志进行轮转(log rotation),常见做法有 应用层轮转 和 系统级轮转 两类。下面按实用程度给你梳理。
logrotate(最常见)Node.js 只管写日志(如 app.log),由系统来切分。
假设日志路径:
/var/log/myapp/app.log
创建配置文件:
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
参数说明:
daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志copytruncate:拷贝后清空原文件(Node 不需要重启)✅ 适合大多数 Node 服务
如果你用 PM2:
pm2 install pm2-logrotate
常用配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
PM2 会自动轮转:
~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log
winston + winston-daily-rotate-filenpm install winston winston-daily-rotate-file
示例:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '7d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 按天生成日志
✅ 自动删除旧日志
✅ 不依赖系统
pino + pino-rollnpm install pino pino-roll
const pino = require('pino');
const roll = require('pino-roll');
const logger = pino(
{ level: 'info' },
roll({ file: 'logs/app.log', frequency: 'daily', size: '10m' })
);
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
或 docker-compose:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
| 场景 | 推荐方案 |
|---|---|
| 普通 Linux 服务 | logrotate |
| PM2 | pm2-logrotate |
| 微服务 / 容器 | winston / pino |
| Docker | Docker logging |
如果你愿意,可以告诉我:
我可以给你 直接可用的配置。