在 Debian 上,Node.js 本身不自带日志轮转功能,通常需要借助系统工具来实现日志轮转。常见做法有以下几种:
logrotate(最推荐,Debian 自带)sudo apt update
sudo apt install logrotate
假设你的 Node.js 日志在:
/var/log/nodejs/app.log
创建配置文件:
sudo nano /etc/logrotate.d/nodejs
内容示例:
/var/log/nodejs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
su root root
}
daily:每天轮转rotate 14:保留 14 个历史文件compress:压缩旧日志copytruncate:不重启 Node.js 直接截断日志(常用)notifempty:空文件不轮转✅
copytruncate对 Node.js 非常友好,因为 Node 默认不会重新打开日志文件
winston + winston-daily-rotate-filenpm install winston winston-daily-rotate-file
示例:
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 适合容器 / PaaS 环境
pm2 日志管理(如果你用 pm2)pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
如果是 systemd 服务:
# /etc/systemd/system/nodeapp.service
StandardOutput=append:/var/log/nodejs/app.log
StandardError=append:/var/log/nodejs/error.log
日志仍由 logrotate 管理即可。
| 场景 | 推荐方式 |
|---|---|
| 服务器部署 | logrotate + copytruncate |
| Docker | 应用内轮转(winston) |
| pm2 | pm2-logrotate |
| 微服务 | 集中日志(ELK / Loki) |
如果你愿意,我可以:
logrotate 配置你现在的 Node.js 是怎么运行的?