Linux下Node.js日志归档管理
一 常用方案与适用场景
| 方案 | 适用场景 | 关键要点 |
|---|---|---|
| logrotate(系统自带) | 直接写文件的应用、多进程/多实例、需要统一系统级策略 | 支持按大小/时间轮转、压缩、保留份数、可配合信号或copytruncate让应用继续写入 |
| PM2 内置日志轮转 | 使用 PM2 部署的 Node.js 服务 | 插件 pm2-logrotate 配置简单,支持按大小/时间轮转、压缩、保留份数 |
| 应用内日志库 | 需要在代码中灵活控制格式、级别、传输与归档 | winston + DailyRotateFile、pino-rotate、log4js 等,支持按天/按大小、压缩与保留策略 |
以上方案均为生产常用做法,可按你的部署方式与运维习惯选择或组合使用。
二 使用 logrotate 进行系统级归档
/var/log/node-app/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
# 若应用支持USR1重开日志,优先使用;否则用copytruncate
killall -USR1 node 2>/dev/null || true
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs-appsudo logrotate -f /etc/logrotate.d/nodejs-app三 使用 PM2 内置日志轮转
pm2 install pm2-logrotatepm2 set pm2-logrotate:max_size 10M # 达到10MB轮转
pm2 set pm2-logrotate:retain 7 # 保留7个历史文件
pm2 set pm2-logrotate:compress true # 压缩旧日志
pm2 set pm2-logrotate:rotateInterval "0 0 * * *" # 每天00:00轮转
pm2 restart all四 应用内日志库归档示例
const winston = require('winston');
const { combine, timestamp, printf } = winston.format;
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: combine(
timestamp(),
printf(({ timestamp, level, message }) => `${timestamp} ${level}: ${message}`)
),
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
logger.info('Hello, world!');
const pino = require('pino');
const { createLogger } = require('pino-rotate');
const logger = createLogger({
level: 'info',
transport: {
target: 'pino-pretty',
options: { colorize: true, translateTime: 'SYS:standard' }
},
interval: '1d', // 按天
path: 'application.log',
maxsize: '20m', // 达到20MB也轮转
gzip: true, // 压缩
retainDays: 14 // 保留14天
});
五 策略与运维建议