Linux環境下Node.js日志清理策略
logrotate是Linux系統自帶的日志管理工具,支持自動輪轉、壓縮、刪除舊日志,無需修改應用代碼,適合大多數場景。
sudo apt-get install logrotate
;CentOS/RHEL系統運行sudo yum install logrotate
。/etc/logrotate.d/
目錄下創建Node.js專用配置文件(如nodejs
),內容示例如下:/path/to/your/nodejs/logs/*.log {
daily # 每天輪轉一次(可選:weekly/monthly)
missingok # 日志文件不存在時不報錯
rotate 7 # 保留最近7個輪轉日志
compress # 壓縮舊日志(節省空間)
notifempty # 日志為空時不輪轉
create 0640 root adm # 新日志文件權限及屬主(根據實際調整)
}
sudo logrotate -f /etc/logrotate.d/nodejs
。若應用使用winston、pino等日志庫,可通過內置模塊實現日志輪轉,適合需要定制化日志格式或路徑的場景。
npm install winston winston-daily-rotate-file
。const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: '/path/to/logs/application-%DATE%.log', // 日志文件名模板(%DATE%會被替換為日期)
datePattern: 'YYYY-MM-DD', // 日期格式(每天一個文件)
zippedArchive: true, // 壓縮舊日志
maxSize: '20m', // 單個日志文件最大20MB
maxFiles: '14d' // 保留14天內的日志
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.json() // JSON格式日志(便于后續分析)
),
transports: [transport]
});
module.exports = logger;
npm install pino pino-rotate
。const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info'
});
rotate({
period: '1d', // 每天輪轉一次
path: '/path/to/logs', // 日志目錄
maxFiles: 7, // 保留7個日志文件
gzip: true // 壓縮舊日志
})(logger);
logger.info('Application started');
若不想依賴第三方工具,可通過cron定時執行shell腳本清理舊日志,適合簡單場景。
/usr/local/bin/clean-nodejs-logs.sh
,內容如下:#!/bin/bash
LOG_DIR="/path/to/your/nodejs/logs"
find "$LOG_DIR" -type f -name "*.log" -mtime +7 -exec rm -f {} \; # 刪除7天前的.log文件
sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
。crontab -e
,添加以下內容(每天凌晨0點執行):0 0 * * * /usr/local/bin/clean-nodejs-logs.sh
若應用通過systemd管理(如nodejs.service
),可創建systemd定時器與服務來清理日志,適合容器化或服務化部署。
clean-nodejs-logs.sh
腳本。/etc/systemd/system/clean-nodejs-logs.service
,內容如下:[Unit]
Description=Clean Node.js logs older than 7 days
[Service]
ExecStart=/usr/local/bin/clean-nodejs-logs.sh
/etc/systemd/system/clean-nodejs-logs.timer
,內容如下:[Unit]
Description=Run clean-nodejs-logs daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable clean-nodejs-logs.timer
sudo systemctl start clean-nodejs-logs.timer
若使用pm2管理Node.js應用,可通過pm2的內置功能實現日志輪轉,無需額外配置工具。
pm2 set pm2:log_rotate true
開啟全局日志輪轉,或通過ecosystem.config.js
文件自定義:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/path/to/logs/out.log',
error_file: '/path/to/logs/err.log',
log_date_format: 'YYYY-MM-DD HH:mm Z',
max_size: '10M', // 單個日志文件最大10MB
retain: 7 // 保留7個日志文件
}]
};
pm2 reload ecosystem.config.js
使設置生效。