在Ubuntu系统中,Node.js应用程序的日志轮转可通过logrotate工具(系统自带)或Node.js日志库内置功能实现。以下是详细配置步骤及注意事项:
logrotate是Ubuntu默认的日志管理工具,支持自动轮转、压缩、删除旧日志,适用于大多数Node.js应用。
多数Ubuntu版本已预装logrotate,未安装时可通过以下命令安装:
sudo apt-get update
sudo apt-get install logrotate
在/etc/logrotate.d/目录下创建新配置文件(如nodejs),用于定义Node.js日志的轮转规则:
sudo nano /etc/logrotate.d/nodejs
在配置文件中添加以下内容(根据实际路径修改/path/to/your/nodejs/app/logs/*.log):
/path/to/your/nodejs/app/logs/*.log {
daily # 每日轮转(可选:weekly/monthly)
rotate 7 # 保留7个轮转后的日志文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(当前轮转的日志不压缩,下次轮转时再压缩)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 创建新日志文件,权限0640,属主root,属组adm
sharedscripts # 多个日志文件匹配时,只执行一次postrotate脚本
postrotate
# 若使用systemd管理Node.js应用,可重启服务以释放日志句柄
systemctl restart your-nodejs-app.service
# 或发送HUP信号给Node.js进程(需替换为实际PID文件路径)
# kill -HUP `cat /path/to/your/nodejs/app/pidfile`
endscript
}
使用-f参数强制执行轮转(模拟自动执行),检查是否有错误:
sudo logrotate -f /etc/logrotate.d/nodejs
logrotate默认通过/etc/cron.daily/logrotate每日自动运行,可通过以下命令查看轮转状态:
tail -f /var/log/logrotate.log
若需更细粒度的轮转控制(如按文件大小、时间动态轮转),可使用winston+winston-daily-rotate-file或pino等库。
以winston为例,安装所需模块:
npm install winston winston-daily-rotate-file
在Node.js应用代码中添加以下配置(示例):
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: '/path/to/your/nodejs/app/logs/application-%DATE%.log', // 日志文件名(含日期占位符)
datePattern: 'YYYY-MM-DD', // 日期格式
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB
maxFiles: '14d', // 保留14天内的日志
level: 'info' // 日志级别
});
const logger = winston.createLogger({
format: winston.format.json(), // 日志格式(JSON)
transports: [transport] // 添加传输层
});
logger.info('Hello, this is a rotated log message!');
运行Node.js应用,检查/path/to/your/nodejs/app/logs/目录下是否生成带日期的日志文件(如application-2025-10-20.log)。
若用PM2管理Node.js应用,可通过pm2-logrotate插件实现日志轮转。
pm2 install pm2-logrotate
设置轮转参数(如按大小、时间轮转,保留数量):
pm2 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 * * *" # 每天0点轮转(cron语法)
pm2 restart all
*.log)。create 0640 root adm中的用户/组需与运行Node.js的用户一致)。postrotate脚本重启应用或发送HUP信号,确保应用写入新日志文件。-d参数测试,避免因配置错误导致日志丢失。rotate 7中的7个文件)建议定期备份到远程存储(如S3),防止本地磁盘空间耗尽。