Linux Node.js 日志轮转配置指南
一 常用方案与适用场景
| 方案 | 适用场景 | 关键优点 | 注意点 |
|---|---|---|---|
| logrotate(系统级) | 任意部署方式(systemd、PM2、Docker、裸进程) | 系统自带、集中管理、稳定可靠 | 需确保应用能重新打开日志文件 |
| PM2 内置 pm2-logrotate | 使用 PM2 管理进程 | 配置简单、与 PM2 深度集成 | 仅适用于 PM2 管理的应用 |
| Node.js 日志库(winston/pino) | 需要在应用内精细控制 | 按大小/时间切分、可异步压缩 | 需处理文件句柄与进程信号 |
| Docker 日志驱动 | 容器化部署 | 与容器运行时集成、无需改代码 | 依赖容器平台能力 |
以上方案均为业界常用做法,生产环境优先选用系统级 logrotate 或与进程管理器配套的轮转方案。
二 方案一 logrotate 系统级配置
sudo apt-get install logrotatesudo yum install logrotate/var/log/yourapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 yourapp yourapp
postrotate
# 可选:通知应用重新打开日志(如支持 SIGUSR1/SIGUSR2 或自定义 reload 脚本)
# kill -USR1 $(cat /var/run/yourapp.pid) 2>/dev/null || true
endscript
}
sudo logrotate -d /etc/logrotate.d/yourappsudo logrotate -f /etc/logrotate.d/yourapp/var/log/yourapp/*.log {
daily
rotate 7
compress
copytruncate
missingok
notifempty
}
三 方案二 PM2 内置日志轮转
pm2 install pm2-logrotatepm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval "0 0 * * *"
pm2 restart all,日志默认位于 ~/.pm2/logs/。四 方案三 应用内轮转(winston/pino)
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [transport]
});
logger.info('Hello, world!');
const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info'
});
rotate({
period: '1d',
path: 'application.log',
size: '20m',
compress: true,
rotate: true
});
logger.info('Hello, world!');
五 容器与集中式日志实践
docker run -d \
--name my_app \
--log-driver local \
--log-opt max-size=10m \
--log-opt max-file=3 \
my_image