在 Linux 下对 JS(Node.js)日志进行分割,常见做法有以下几种,按“是否改代码”和“是否用系统工具”来分:
适合:已输出到文件的日志(如 app.log)
示例配置 /etc/logrotate.d/nodejs:
/var/log/nodejs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
daily:每天分割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node 进程(很重要)✅ 优点:简单、稳定
❌ 缺点:不是“实时按大小”
适合:日志特别大
#!/bin/bash
LOG=/var/log/nodejs/app.log
MAX=104857600 # 100MB
if [ -f "$LOG" ]; then
size=$(stat -c%s "$LOG")
if [ "$size" -gt "$MAX" ]; then
mv "$LOG" "$LOG.$(date +%Y%m%d%H%M%S)"
touch "$LOG"
fi
fi
加 cron:
* * * * * /opt/scripts/split_log.sh
npm i winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 支持:
适合:高性能日志
npm i pino pino-roll
const pino = require('pino');
const logger = pino({
transport: {
target: 'pino-roll',
options: {
file: '/var/log/nodejs/app.log',
frequency: 'daily',
size: '10m'
}
}
});
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
| 场景 | 推荐方式 |
|---|---|
| 已跑起来不改代码 | logrotate |
| 微服务 / 容器 | pino / winston |
| PM2 管理 | pm2-logrotate |
| 超大日志 | 按大小 + cron |
如果你愿意,可以告诉我:
我可以直接给你一套现成方案。