1. 使用日志輪轉工具(推薦)
日志輪轉是解決日志文件過大的核心方法,通過定期切割、壓縮和刪除舊日志,控制單個文件大小及數量。Linux系統自帶logrotate工具,配置靈活且無需修改應用代碼:
/etc/logrotate.d/
目錄下新建文件(如node-app
),添加以下內容(以/var/log/node-app.log
為例):/var/log/node-app.log {
daily # 按天輪轉(也可改為size 100M按大小輪轉)
rotate 7 # 保留最近7個日志文件
compress # 壓縮舊日志(節省空間)
missingok # 若日志文件不存在也不報錯
notifempty # 若日志為空則不輪轉
copytruncate # 復制原日志后清空,避免重啟應用
dateext # 添加日期后綴(如node-app.log-20251021)
}
sudo logrotate -d /etc/logrotate.d/node-app
模擬測試,確認配置無誤后用sudo logrotate -f /etc/logrotate.d/node-app
強制立即輪轉。2. 第三方日志庫內置輪轉功能
通過Node.js日志庫(如Winston、Pino)的內置插件實現更精細的控制,適合需要結構化日志或自定義格式的場景:
npm install winston-daily-rotate-file
,配置示例如下:const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log', // 日志文件路徑(含日期占位符)
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 壓縮舊日志
maxSize: '20m', // 單個文件最大20MB
maxFiles: '14d' // 保留14天日志
})
]
});
logger.info('This is a rotated log message.');
npm install pino-daily-rotate-file
,配置示例如下:const pino = require('pino');
const pinoDailyRotateFile = require('pino-daily-rotate-file');
const logger = pino({}, pinoDailyRotateFile({
period: '1d', // 按天分割
dir: 'logs', // 日志存儲目錄
prefix: 'app' // 文件名前綴
}));
logger.info('This is a Pino rotated log message.');
以上配置均支持按大小或時間輪轉,自動壓縮舊日志,并限制保留數量。
3. 手動清理臨時日志
若日志文件緊急過大,可通過Linux命令快速釋放空間:
sudo truncate -s 0 /path/to/your/logfile.log
find /path/to/your/logs -type f -name "*.log" -mtime +30 -exec rm -f {} \;
此方法適用于臨時緩解磁盤空間壓力,但無法替代自動化日志管理。
4. 限制日志記錄級別
通過調整日志級別,減少不必要的日志輸出(如生產環境無需debug
或trace
級別日志):
const logger = winston.createLogger({
level: 'info', // 僅記錄info及以上級別(error/warn/info)
transports: [new winston.transports.File({ filename: 'app.log' })]
});
log4js.configure({
appenders: { file: { type: 'file', filename: 'app.log' } },
categories: { default: { appenders: ['file'], level: 'warn' } } // 僅記錄warn及以上
});
降低日志級別可顯著減少日志文件大小,同時保留關鍵信息。
5. 使用PM2進程管理器的日志輪轉
若使用PM2管理Node.js應用,可通過其內置的pm2-logrotate
模塊實現日志管理:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 100M # 單個日志文件最大100MB
pm2 set pm2-logrotate:retain 10 # 保留最近10個日志文件
pm2 set pm2-logrotate:compress true # 壓縮舊日志
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每天午夜輪轉
PM2會自動監控應用日志,符合條件時觸發輪轉,適合使用PM2部署的項目。