日志轮转是Node.js应用在生产环境中必不可少的运维环节,能有效避免单个日志文件过大占用磁盘空间、提升日志查询效率,并保障应用长期稳定运行。在Debian系统中,主要有两种主流实现方式:系统级logrotate工具(通用性强,适用于所有Node.js部署方式)和PM2内置日志管理插件(适合PM2管理的应用,配置简单)。

logrotate是Debian Linux系统预装的日志管理工具,支持按时间/大小轮转日志、压缩旧日志、删除过期日志,并能与Node.js应用联动(如通知应用重新打开日志文件),是生产环境推荐的日志轮转方案。
Debian系统默认已安装logrotate,若未安装,可通过以下命令安装:
sudo apt-get updatesudo apt-get install logrotate -y在/etc/logrotate.d/目录下新建配置文件(如my-nodejs-app),文件名需与Node.js应用关联(便于管理):
sudo nano /etc/logrotate.d/my-nodejs-app配置文件的核心参数说明及示例如下(以/var/www/myapp/logs/app.log为例):
/var/www/myapp/logs/*.log {# 匹配Node.js应用的日志路径(支持通配符)daily# 轮转频率:每天(可选:weekly/monthly,按需选择)rotate 7 # 保留最近7个轮转后的日志文件(避免无限堆积)compress # 压缩旧日志(节省存储空间,默认使用gzip)delaycompress# 延迟压缩:当前轮转的日志(如app.log.1)暂不压缩,下次轮转时再压缩(避免影响最新日志访问)missingok# 若日志文件不存在,不报错(避免因应用未启动导致轮转失败)notifempty # 若日志文件为空,不进行轮转(减少不必要的操作)create 0640 www-data www-data# 轮转后创建新日志文件,权限为0640,属主为www-data(需与应用运行用户一致)sharedscripts# 所有日志轮转完成后,统一执行postrotate脚本(避免多次重启应用)postrotate# 通知Node.js应用重新打开日志文件(适配pm2或直接运行的应用)if [ -f /var/run/myapp.pid ]; thenkill -USR1 $(cat /var/run/myapp.pid)# 向应用发送USR1信号(需应用监听该信号)fiendscript}使用-f参数强制立即执行轮转(无需等待定时任务),检查配置是否正确:
sudo logrotate -f /etc/logrotate.d/my-nodejs-app执行后,app.log会被切割为app.log.1.gz(压缩)、app.log.2.gz等,新日志继续写入app.log。
logrotate默认通过/etc/cron.daily/logrotate定时任务每天自动运行(系统级配置),无需额外设置。若需调整定时频率,可修改/etc/crontab文件。
若使用PM2进程管理器管理Node.js应用,可直接通过pm2-logrotate插件实现日志轮转,无需依赖系统级工具,配置更便捷。
通过PM2命令安装插件:
pm2 install pm2-logrotate通过pm2 set命令设置轮转规则(常用参数说明):
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 * * *'# 轮转时间(cron格式,如每天凌晨0点)观察~/.pm2/logs/目录(PM2默认日志路径),若日志文件出现app.log.1、app.log.2.gz等,说明轮转生效。
若不想依赖外部工具,可在Node.js应用中集成日志库(如winston+winston-daily-rotate-file),实现应用层日志轮转。例如:
const winston = require('winston');const DailyRotateFile = require('winston-daily-rotate-file');const transport = new DailyRotateFile({filename: '/var/www/myapp/logs/application-%DATE%.log',// 日志文件名(含日期)datePattern: 'YYYY-MM-DD', // 日期格式zippedArchive: true, // 压缩旧日志maxSize: '20m',// 单个文件最大大小maxFiles: '14d', // 保留14天日志});const logger = winston.createLogger({level: 'info',format: winston.format.json(),transports: [transport],});logger.info('Application started');这种方式无需修改系统配置,但需维护应用代码,适合定制化需求高的场景。
/var/www/myapp/logs/需属于应用运行用户,如www-data)。USR1),重新打开日志文件(避免日志写入旧文件)。rotate(保留数量)和compress(压缩),避免占用过多磁盘空间。logrotate -f或PM2命令测试,确保轮转逻辑正确。通过上述方案,可有效实现Debian系统中Node.js应用的日志轮转,保障日志管理的规范性和应用的稳定性。