在 Linux 上 Node.js 日志过大,常见处理方式和最佳实践如下:
du -sh /path/to/logs/*
ls -lh /path/to/logs
# 推荐:清空而不删除
: > /path/to/app.log
# 或
truncate -s 0 /path/to/app.log
⚠️ 不要直接 rm 正在写入的日志文件,否则:
# CentOS
yum install logrotate
# Ubuntu / Debian
apt install logrotate
sudo vim /etc/logrotate.d/node-app
/path/to/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
说明:
copytruncate:复制后清空,适合 Node 不重启的场景rotate 7:保留 7 份compress:gzip 压缩logrotate -d /etc/logrotate.d/node-app # 模拟
logrotate -f /etc/logrotate.d/node-app # 强制执行
winstonpinobunyan示例(winston):
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
maxSize: '20m'
});
logger.level = 'info'; // 不要 debug / silly 上生产
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
docker system prune
lsof | grep deleted
如果有 Node 进程占用 deleted 日志:
# 重启 Node 服务
pm2 restart all
# 或
systemctl restart your-node-service
✅ 生产环境:logrotate + winston/pino
✅ 临时处理:: > logfile
❌ 不要 rm 正在写的日志
如果你愿意,可以告诉我:
我可以给你更精确的配置。