Nginx 日志切割對于日志管理和系統維護至關重要。以下是幾種常見的 Nginx 日志切割方法:
logrotate 是 Linux 系統中用于管理日志文件的工具,可以按時間或大小對日志文件進行切割、壓縮和清理。以下是使用 logrotate 進行 Nginx 日志切割的步驟:
創建 logrotate 配置文件:
在 /etc/logrotate.d/
目錄下創建一個新的配置文件,例如 nginx
。配置文件示例如下:
/var/log/nginx/access.log {
daily # 按天切割日志
rotate 30 # 保留 30 個日志文件
missingok # 如果日志文件不存在,則不報錯
notifempty # 如果日志文件為空,則不進行輪替
compress # 壓縮舊日志文件
delaycompress # 延遲壓縮上一個周期的日志文件
create 0640 www-data www-data # 新日志文件的權限和所有者
sharedscripts # 共享腳本,等 access 和 error 兩個日志都輪轉之后再執行下面的腳本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid) # 向 Nginx 發送 USR1 信號,重開日志文件
fi
endscript
}
/var/log/nginx/error.log {
daily # 按天切割日志
rotate 30 # 保留 30 個日志文件
missingok # 如果日志文件不存在,則不報錯
notifempty # 如果日志文件為空,則不進行輪替
compress # 壓縮舊日志文件
delaycompress # 延遲壓縮上一個周期的日志文件
create 0640 www-data www-data # 新日志文件的權限和所有者
sharedscripts # 共享腳本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid) # 重啟 Nginx 日志進程
fi
endscript
}
測試配置: 使用以下命令測試配置文件是否正確:
sudo logrotate -vf /etc/logrotate.conf
設置定時任務:
使用 crontab
設置定時任務,使 logrotate 每天執行日志切割。例如,每天凌晨 0 點執行:
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
除了使用 logrotate,還可以編寫自定義腳本來實現日志切割。以下是一個簡單的 Bash 腳本示例:
#!/bin/bash
# 指定日志路徑和備份目錄
LOG_PATH="/usr/local/nginx/logs"
BACKUP_PATH="/var/log/nginx/backup"
# 獲取當前日期并生成備份目錄
DATE=$(date +"%Y-%m-%d")
BACKUP_DIR="$BACKUP_PATH/$DATE"
# 創建備份目錄
mkdir -p "$BACKUP_DIR"
# 移動并重命名日志文件
mv "$LOG_PATH/access.log" "$BACKUP_DIR/access_$DATE.log"
mv "$LOG_PATH/error.log" "$BACKUP_DIR/error_$DATE.log"
# 通知 Nginx 重新生成新的日志文件
kill -USR1 $(cat "$LOG_PATH/nginx.pid")
設置定時任務:
使用 crontab
設置定時任務,使腳本每天執行日志切割。例如,每天凌晨 1 點執行:
0 1 * * * /path/to/your/script.sh
無論使用哪種方法,都可以通過以下命令驗證日志切割是否按預期工作:
檢查日志文件是否已切割:
tail -n 4 /var/log/nginx/access.log
tail -n 4 /var/log/nginx/access.log.1
重新加載 Nginx 配置以應用更改:
sudo nginx -s reload
通過以上方法,可以有效地管理和維護 Nginx 日志文件,確保系統的穩定性和性能。