Nginx 記錄檔切割

來源:互聯網
上載者:User

偶然發現access.log有21G大,所以將其切割。

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-ddYESTERDAY=$(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 設定為距當前時較近的時間測試一下,否則在零點出問題就不好了 。

Windows 平台切割

要在 Windows 平台上做這件事情就有點麻煩了。在 Windows 中沒有原生的命令能夠獲得昨天的日期,Windows 中的計劃任務設定我感覺也沒有 Linux 的 crontab 用得方便,再有批處理命令也沒有 Shell 指令碼功能強大。總之,逐一來解決這些問題吧。

新浪部落格上有一篇文章 nginx for windows日誌切割,但這篇文章有兩個不足之處:切割後的記錄檔不是以昨天的日期命名;需要停止 Nginx 服務。為了切割日誌停止服務,我認為有所不值,如果訪問量較小的話問題不大,但是訪問量較大的話這種做法是非常不可取的。為了彌補這些缺陷,我們對這個批次檔進行了改進。

要 Windows 平台上使用 Linux 的 date 命令以獲得昨天的日期,我們可以到 SourceForge上去下載 UnxUtils這 個工具。UnxUtils 是個非常強大的工具集,將大多數的 Linux 命令都移植到 Windows 平台上來了,比如:ls, grep, wc 等等 120 個命令,當然了其中也包括了我們需要的 date 工具。將這個工具解壓到一個目錄中,假定是 d:\common-path\UnxUtils 目錄中,將那些工具所在的 d:\common-path\UnxUtils\usr\local\wbin 添加到系統的環境變數 PATH 中,可以加到最後去。由於 Windows 平台中有 date 內建命令,因此需要將 UnxUtils 的 date.exe 改名為其他的,比如改為 udate.exe。用 cmd 開啟控制台,輸入:

D:\>udate -d "yesterday" +%Y-%m-%d2010-05-31D:\>_

如果能正確輸出昨天日期的話,那麼這一點我們就搞定了 。

接下來需要寫一個批次檔,假定我們的 Nginx 是放在 d:\httpServer\nginx-0.7.64 目錄中的,我們就在這個目錄中建一個 cut-log.bat 的檔案:

Batch代碼
  1. @echo off
  2. rem  擷取昨天的日期,存入 YESTERDAY 變數,udate 參數中的 % 需要改成 %% 進行轉義
  3. for /f %%a in (‘udate -d ”yesterday” +%%Y-%%m-%%d’) do set YESTERDAY=%%a
  4. rem 設定 Nginx 位於的盤符
  5. set NGINX_DRIVER=d:
  6. rem 設定 Nginx 的主目錄
  7. set NGINX_PATH=%NGINX_DRIVER%\green\httpServer\nginx-0.7.64
  8. rem 設定 Nginx 的日誌目錄
  9. set LOG_PATH=%NGINX_PATH%\logs
  10. rem 移動檔案
  11. move %LOG_PATH%\access.log %LOG_PATH%\access_%YESTERDAY%.log
  12. rem 切換到 Nginx 所在的盤符
  13. %NGINX_DRIVER%
  14. rem 進入 Nginx 的主目錄
  15. cd %NGINX_PATH%
  16. rem 向 nginx 發送 reopen 訊號以重新開啟記錄檔,功能與 Linux 平台中的 kill -USR1 一致
  17. nginx -s reopen
  18. echo on
@echo offrem  擷取昨天的日期,存入 YESTERDAY 變數,udate 參數中的 % 需要改成 %% 進行轉義for /f %%a in ('udate -d "yesterday" +%%Y-%%m-%%d') do set YESTERDAY=%%arem 設定 Nginx 位於的盤符set NGINX_DRIVER=d:rem 設定 Nginx 的主目錄set NGINX_PATH=%NGINX_DRIVER%\green\httpServer\nginx-0.7.64rem 設定 Nginx 的日誌目錄set LOG_PATH=%NGINX_PATH%\logsrem 移動檔案move %LOG_PATH%\access.log %LOG_PATH%\access_%YESTERDAY%.logrem 切換到 Nginx 所在的盤符%NGINX_DRIVER%rem 進入 Nginx 的主目錄cd %NGINX_PATH%rem 向 nginx 發送 reopen 訊號以重新開啟記錄檔,功能與 Linux 平台中的 kill -USR1 一致nginx -s reopenecho on

這個批處理寫好後,將其加入 Windows 的計劃任務中,設定為每天零時執行。需要注意的是,在執行 nginx -s reopen 命令時,目前的目錄必須位於 Nginx 的主目錄中,否則會找不到記錄檔在哪個目錄中(估計 Nginx 預設採用相對路徑尋找),這也就是批處理中需要進入盤符和 Nginx 主目錄的原因了,因為任務計劃執行時並不是在 Nginx 的主目錄中。

結束語

這裡主要介紹了一下 Linux 平台和 Windows 平台上切割 Nginx 記錄檔的方法。Linux 中可以直接使用一些內建的命令完成,而在 Windows 中需要裝載 UnxUtils 工具,不過這個工具集非常有用,比如使用其中的 tail 命令,我們在 Windows 中也能很方便地在控制台中使用 tail -f 即時地查看記錄檔的輸出。

更多參考
  • 需要瞭解更多在 Linux 中使用 kill 命令向 Nginx 進程發送其他訊號,以及該訊號的意義可以參考 Nginx 中文 Wiki 上的 運行和控制 Nginx – 命令列參數和訊號 這篇中文文檔。
  • Windows 平台使用 nginx -s 命令向 Nginx 主進程發送各種訊號,以及該訊號的意義可以在 安裝Nginx 一文的最後找到。

Permalink to : http://www.bluek.org/blog/index.php/2010/08/11/178/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.