在 Linux 环境下对 Node.js 日志进行归档,常见的目标是:
✅ 控制日志文件大小
✅ 防止磁盘被写满
✅ 方便排查历史问题
✅ 自动清理过期日志
下面按 推荐程度 给你几种成熟方案,并附示例。
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',
maxSize: '20m', // 单个文件最大 20MB
maxFiles: '14d', // 保留 14 天
zippedArchive: true // 归档时压缩
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
transport,
new winston.transports.Console()
]
});
logger.info('hello world');
✅ 优点
pm2 logs
~/.pm2/logs/
ecosystem.config.js
module.exports = {
apps: [{
name: 'app',
script: 'app.js',
max_memory_restart: '500M',
error_file: '/var/log/app/err.log',
out_file: '/var/log/app/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
};
⚠️ PM2 不会自动归档,需要配合 logrotate
适合 所有 Node.js 日志(无论用什么日志库)
sudo vim /etc/logrotate.d/node-app
/var/log/myapp/*.log {
daily
rotate 14
size 100M
missingok
notifempty
compress
delaycompress
copytruncate
}
| 参数 | 含义 |
|---|---|
| daily | 每天轮转 |
| rotate 14 | 保留 14 份 |
| size 100M | 超过 100M 即轮转 |
| compress | gzip 压缩 |
| copytruncate | 不重启应用 |
✅ 优点
npm install pino pino-roll
const pino = require('pino');
const pinoRoll = require('pino-roll');
const logger = pino(
pinoRoll({
file: '/var/log/myapp/app.log',
frequency: 'daily',
size: '10m',
limit: 7
})
);
logger.info('pino rolling log');
✅ 高性能
✅ 适合高并发服务
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
app
✅ 最佳实践
✅ 不污染容器文件系统
| 场景 | 推荐方案 |
|---|---|
| 普通 Node.js 服务 | Winston + logrotate |
| PM2 | PM2 + logrotate |
| 高性能 | Pino + pino-roll |
| Docker | stdout + Docker log driver |
如果你愿意,可以告诉我:
我可以直接帮你写 完整配置。