Linux系统Node.js日志存储优化
一 核心优化策略
二 日志轮转与保留策略
| 方案 | 适用场景 | 关键配置要点 |
|---|---|---|
| 应用内轮转(Winston + winston-daily-rotate-file) | 单实例、容器化、快速接入 | datePattern、maxSize、maxFiles、zippedArchive: true |
| 系统级 logrotate | 多进程/多实例、系统统一管理 | `daily |
| PM2 内置/pm2-logrotate | 使用 PM2 部署 | pm2 set pm2-logrotate:max_size 1G、pm2 set pm2-logrotate:rotateInterval '0 0 * * *'(每日) |
三 配置示例
npm i winston winston-daily-rotate-fileconst winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [transport]
});
logger.info('Hello World!', { service: 'order', traceId: 'abc-123' });
/var/log/nodejs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 node node
postrotate
systemctl reload pm2-node-app >/dev/null 2>&1 || true
endscript
}
sudo logrotate -f /etc/logrotate.d/nodejsmodule.exports = {
apps: [{
name: 'api',
script: 'app.js',
log_date_format: 'YYYY-MM-DD HH:mm Z',
out_file: './logs/out.log',
error_file: './logs/err.log',
merge_logs: true,
log_file: './logs/node.log',
time: true,
log_rotation: {
interval: '1d',
line_limit: 200000,
size_limit: 10000000
}
}]
};
pm2 set pm2-logrotate:max_size 1G、pm2 set pm2-logrotate:rotateInterval '0 0 * * *'。四 集中式日志与系统整合
module(load="imudp")、input(type="imudp" port="514")、local0.* @remote-server-ip:514const syslog = require('syslog');
syslog.openlog('nodejs-app', { facility: 'local0' });
syslog.syslog('Hello, world!');
syslog.closelog();
五 运维与监控建议