在Debian系統中,Node.js應用日志持續增長可能導致磁盤空間耗盡,影響系統穩定性和運維效率。以下是針對性強、易操作的解決方法,覆蓋預防、自動化管理與應急處理:
logrotate是Debian自帶的日志管理工具,可自動完成日志分割、壓縮、刪除,無需修改應用代碼,適合大多數場景。
sudo apt-get update && sudo apt-get install logrotate -y
/etc/logrotate.d/下新建文件(如nodejs),添加以下內容(根據實際日志路徑調整):/var/www/your-node-app/logs/*.log {
daily # 每日輪轉(也可改為weekly/monthly)
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(節省空間)
delaycompress # 延遲1天壓縮(避免影響最新日志讀?。? missingok # 日志文件不存在時不報錯
notifempty # 日志為空時不輪轉
create 0640 www-data www-data # 新日志文件權限與屬主(根據應用用戶調整)
sharedscripts # 所有日志輪轉完成后執行postrotate
postrotate
# 若使用PM2管理進程,需通知其重新打開日志
if [ -f /var/run/pm2.pid ]; then
pm2 reload logs
fi
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs
sudo logrotate -f /etc/logrotate.d/nodejs
app.log會被切割為app.log.1.gz(壓縮)、app.log.2.gz等,保留最近7天的壓縮日志。若用PM2管理Node.js進程,可使用pm2-logrotate插件,無需依賴系統logrotate,配置更靈活。
pm2 install pm2-logrotate
pm2 set pm2-logrotate:compress true # 啟用壓縮
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每天凌晨輪轉(cron語法)
pm2 set pm2-logrotate:max_days 7 # 保留7天舊日志
pm2 set pm2-logrotate:max_size 1G # 單個日志文件最大1GB(可選)
配置后,PM2會自動處理日志輪轉,無需額外操作。若需更細粒度的日志管理(如按大小、級別分割),可使用winston或bunyan等日志庫,內置輪轉功能。
winston及winston-daily-rotate-file插件:npm install winston winston-daily-rotate-file
配置日志輪轉(單個文件最大10MB,保留7個):const winston = require('winston');
const { combine, timestamp, printf } = winston.format;
const logger = winston.createLogger({
level: 'info',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
printf(({ timestamp, level, message }) => `${timestamp} [${level}]: ${message}`)
),
transports: [
new winston.transports.DailyRotateFile({
filename: '/var/www/your-node-app/logs/combined.log',
datePattern: 'YYYY-MM-DD', // 按日期分割
zippedArchive: true, // 壓縮舊日志
maxSize: '10m', // 單個文件最大10MB
maxFiles: '7d', // 保留7天
createSymlink: true // 創建符號鏈接(方便訪問最新日志)
}),
new winston.transports.Console() // 同時輸出到控制臺(開發環境有用)
]
});
logger.info('This is a log message with size-based rotation.');
這種方式適合需要自定義日志格式、級別或存儲路徑的場景。生產環境中,降低日志級別可大幅減少日志量(如從debug改為info或warn)。
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 生產環境僅記錄warn及以上
// ...其他配置
});
通過NODE_ENV環境變量區分環境,避免生產環境輸出大量無用調試日志。若日志已占用大量空間,可通過cron定時任務定期刪除舊日志(如30天前)。
crontab -e
0 2 * * * find /var/www/your-node-app/logs -type f -name "*.log" -mtime +30 -exec rm -f {} \;
此命令會刪除logs目錄下30天前的.log文件,釋放磁盤空間。對于分布式或大型應用,建議使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等集中式日志系統,將日志發送至遠程服務器存儲、分析。
winston-elasticsearch插件:npm install winston-elasticsearch
配置日志發送至Elasticsearch:const winston = require('winston');
const Elasticsearch = require('winston-elasticsearch');
const logger = winston.createLogger({
transports: [
new Elasticsearch({
level: 'info',
clientOpts: { node: 'http://your-elasticsearch-server:9200' }
})
]
});
集中式日志管理可實現日志聚合、實時分析、報警,適合團隊協作和大規模應用。以上方法可根據應用規模、運維習慣選擇組合使用(如logrotate+日志級別控制為基礎方案,PM2插件適合PM2管理場景,集中式日志適合大型系統)。通過合理配置,可有效解決Debian下Node.js日志過大的問題。