Nginx 日誌文件切割

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代碼 

  1. #!/bin/bash

  2. ## 零點執行該腳本


  3. ## Nginx 日誌文件所在的目錄

  4. LOGS_PATH=/usr/local/nginx/logs


  5. ## 獲取昨天的 yyyy-MM-dd

  6. YESTERDAY=$(date -d ”yesterday” +%Y-%m-%d)


  7. ## 移動文件

  8. mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log


  9. ## 向 Nginx 主進程發送 USR1 信號。USR1 信號是重新打開日誌文件

  10. kill -USR1 $(cat /usr/local/nginx/nginx.pid)

#!/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 新增一個定時任務,在其中增加執行這個腳本:

Shell代碼 

  1. 0 0 * * * /bin/bash /usr/local/nginx/sbin/cut-log.sh

0 0 * * * /bin/bash /usr/local/nginx/sbin/cut-log.sh

到這裏 Linux 下切割 Nginx 日誌就完成了,可以將 crontab 設置爲距當前時較近的時間測試一下,否則在零點出問題就不好了 

本文章轉自於:傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章