Nginx 是一個非常輕量的 Web 伺服器,體積小、性能高、速度快等諸多優點。但不足的是也存在缺點,比如其産生的通路日志檔案一直就是一個,不會自動地進行切割,如果通路量很大的話,将導緻日志檔案容量非常大,不便于管理。當然了,我們也不希望看到這麼龐大的一個通路日志檔案,那需要手動對這個檔案進行切割。
在 Linux 平台上 Shell 腳本豐富,使用 Shell 腳本加 crontab 指令能非常友善地進行切割,但在 Windows 平台上就麻煩一些了,剛才弄了好長時間,就在這裡記錄整理一下。
日志檔案切割要求
由于 Nginx 的日志都是寫在一個檔案當中的,是以,我們需要每天零點将前一天的日志存為另外一個檔案,這裡我們就将 Nginx 位于 logs 目錄中的 access.log 存為 access_[yyyy-MM-dd].log 的檔案。其實 logs 目錄中還有個 error.log 的錯誤日志檔案,這個檔案也需要每天切割一個,在這裡就說 access.log 了,error.log 的切割方法類似。
Linux 平台切割
在 Linux 平台上進行切割,需要使用 date 指令以獲得昨天的日期、使用 kill 指令向 Nginx 程序發送重新打開日志檔案的信号,以及 crontab 設定執行任務周期。
先建立一個 Shell 腳本,如下:
Shell代碼
#!/bin/bash
## 零點執行該腳本
## Nginx 日志檔案所在的目錄
LOGS_PATH=/usr/local/nginx/logs
## 擷取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d ”yesterday” +%Y-%m-%d)
## 移動檔案
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
## 向 Nginx 主程序發送 USR1 信号。USR1 信号是重新打開日志檔案
kill -USR1 $(cat /usr/local/nginx/nginx.pid)
上面這個腳本中的最後一行必須向 Nginx 的程序發送 USR1 信号以重新打開日志檔案,如果不寫的話,Nginx 會繼續将日志資訊寫入 access_[yyyy-MM-dd].log 的那個檔案中,這顯然是不正确的。
腳本完成後将其存入 Nginx 安裝目錄的 sbin 中,取名為 cut-log.sh,之後使用 crontab -e 新增一個定時任務,在其中增加執行這個腳本:
0 0 * * * /bin/bash /usr/local/nginx/sbin/cut-log.sh
到這裡 Linux 下切割 Nginx 日志就完成了,可以将 crontab 設定為距目前時較近的時間測試一下,否則在零點出問題就不好了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5ibpJ3ZnlmYtU2YhZ2Xv9CX4ATOwQzLcNjMx8WYnVWar5WYyZ2LcRXZu9VY2Fman9Gbi9CXzV2Zh1WavwFdl5mLhZXYqd2bsJmL3d3dvw1LcpDc0RHaiojIsJye.gif)
。
本文章轉自于:傳送門