在 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
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天轮转rotate 14:保留 14 个历史文件compress:压缩旧日志copytruncate:复制后清空原文件(不影响 Node.js 文件句柄)notifempty:空文件不轮转⚠️ 若 Node.js 使用
fs.appendFile或console.log写文件,copytruncate很关键
sudo logrotate -d /etc/logrotate.d/myapp # 调试
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
npm install winston winston-daily-rotate-file
示例:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello log');
优点:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
若 Node.js 运行在 Docker:
json-file 日志驱动/etc/docker/daemon.json{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
| 场景 | 推荐方案 |
|---|---|
| 传统服务器部署 | logrotate |
| PM2 部署 | pm2-logrotate |
| 微服务 / 容器 | winston + daily-rotate |
| 高并发写日志 | 应用内轮转 |
如果你能说明:
我可以给你一份可直接用的配置。