在Debian系统中,Node.js日志文件过大易导致磁盘空间耗尽,影响系统稳定性。以下是5类有效方法,覆盖预防、自动管理与清理环节,可根据实际需求组合使用:
日志轮转通过分割日志文件、压缩旧日志、限制保留数量,从根源控制单个日志文件的大小。Debian系统自带logrotate
工具,配置简单且高效:
sudo apt-get install logrotate
/etc/logrotate.d/nodejs-app
),添加以下内容(根据实际路径调整):/path/to/your/nodejs/app/logs/*.log {
daily # 每天轮转(也可改为weekly/monthly)
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免立即压缩影响性能)
missingok # 日志文件不存在时不报错
notifempty # 空日志文件不轮转
copytruncate # 复制原日志后清空,适用于无法重启Node.js的场景
dateext # 使用日期作为轮转文件后缀(如app-20250921.log.gz)
dateformat -%Y%m%d # 日期格式
}
sudo logrotate -d /etc/logrotate.d/nodejs-app # 模拟运行(查看输出是否正确)
sudo logrotate -f /etc/logrotate.d/nodejs-app # 强制立即轮转
该方法适用于所有Node.js应用,无需修改代码,是生产环境首选。若需更灵活的轮转策略(如按文件大小轮转),可使用日志库的扩展插件,如winston-daily-rotate-file
(配合winston
)、pino-rotate
(配合pino
):
npm install winston winston-daily-rotate-file
(配置代码):const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new DailyRotateFile({
filename: '/path/to/logs/application-%DATE%.log', // 日志文件名模板
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '100m', // 单个文件最大100MB
maxFiles: '30d' // 保留30天的日志
})
]
});
logger.info('This log will be rotated daily and compressed.');
npm install pino pino-rotate
(配置代码):const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info',
transport: {
target: 'pino-rotate',
options: {
period: '1d', // 每天轮转
path: '/path/to/logs/application.log',
maxsize: '50m', // 单个文件最大50MB
maxfiles: '14' // 保留14个文件
}
}
});
logger.info('Pino log with auto-rotation.');
这类方法适合需要定制化轮转规则的应用(如按大小而非时间轮转),且能保持代码的可维护性。若使用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 * * *" # 每天00:00轮转
PM2会自动将日志存储在~/.pm2/logs/
目录下,并按配置轮转。该方法适合使用PM2部署的应用,运维成本低。日志级别决定了记录的信息量:
warn
或error
,避免记录debug
(调试)或info
(常规信息)级别的冗余日志。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'info', // 生产环境仅记录warn及以上
format: winston.format.json(),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
const logger = pino({ level: process.env.NODE_ENV === 'production' ? 'warn' : 'info' });
通过降低日志级别,可直接减少日志文件的大小(尤其是高频调用的接口或服务)。即使有轮转策略,仍需定期清理长期未使用的旧日志(如超过3个月的日志),可通过以下方式实现:
/usr/local/bin/clean_old_logs.sh
):#!/bin/bash
LOG_DIR="/path/to/nodejs/logs"
DAYS_TO_KEEP=90 # 保留90天内的日志
find "$LOG_DIR" -type f -name "*.log.gz" -mtime +$DAYS_TO_KEEP -exec rm {} \; # 删除超过90天的压缩日志
find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS_TO_KEEP -exec rm {} \; # 删除超过90天的未压缩日志
(添加cron任务,每天凌晨执行):crontab -e
添加以下内容:0 0 * * * /bin/bash /usr/local/bin/clean_old_logs.sh
该方法适合补充轮转策略,彻底释放长期不用的日志占用的空间。通过以上方法的组合,可有效控制Debian环境下Node.js日志文件的大小,保障系统的稳定运行。