nginx自動切割訪問日誌

2021-06-22 12:30:15 字數 2602 閱讀 9583

web 訪問日誌 (access_log) 記錄了所有外部客戶端對web伺服器的訪問行為,包含了客戶端ip,訪問日期,訪問的url資源,伺服器返回的http狀態碼等重要資訊。

一條典型的web訪問日誌如下:

規劃:1、  要解決問題:

2、nignx沒有自動分開檔案儲存日誌的機制。由於nginx它不會幫你自動分檔案儲存。所以,需要自己編寫指令碼來實現。

shell指令碼檔案nginx_log_division.sh內容如下:

# /bin/bash

logs_path="/data/wwwlogs/"

#以前的日誌檔案。

log_name="***.log"   

pid_path="/usr/local/nginx/logs/nginx.pid"

mv $$ $$_$(date --date="last   week" +"%y-%m-d").log

kill -usr1 `cat $`

上面shell指令碼的原理是:先把以前的日誌檔案移動重新命名成乙個,目的是就是備份。

按照上個周一的本日來命名,執行指令碼的時候時間點是」2013-09-16」,那麼生成檔名稱是」***.log_ 20130909.log」。

在沒有執行kill -usr1 `cat $`之前,即便已經對檔案執行了mv命令而改變了檔名稱,nginx還是會向新命名的檔案」 ***.log_ 20130909」照常寫入日誌資料的。原因在於:linux系統中,核心是根據檔案描述符來找檔案的。

----------------對linux檔案描述符的理解

檔案描述符是linux核心為每個開啟的檔案命名的乙個整數標識。

linux核心為每乙個程序生成(或者說維護)乙個」檔案描述符表」,這個檔案描述符表記錄的是「此程序所開啟的檔案(進行標識)」。

在這裡的環境中,nginx就是乙個執行中的程序,這個程序早就開啟了乙個日誌檔案,在檔案描述符表是記錄了檔案的。

即便日誌檔案的路徑改變了,但是還是能夠找到(根據檔案描述符表可以定位)。

----------------------------------------------

當執行命令「kill -usr1 `cat $`」的時候,nginx.pid檔案中儲存的其實就是乙個數字(自己可以開啟看一下,我這裡是894),nginx 將其主程序的 pid (程序號)寫入到了nginx.pid 檔案中,所以可以通過cat命令直接拿到其主程序號,直接操作指定的程序號。

kill  -usr1 `cat $` 就等同於

kill –usr1 894  #指定發訊號(usr1)訊號給這個程序編號。

在linux系統中,linux是通過訊號與」正在執行的程序」進行通訊的。linux系統中,也很多預定義好的訊號,像sighup。usr1是使用者自定義訊號。可以理解為:程序自己定義接到這個訊號該幹嘛(也就是程序編寫者自己確定收到這個訊號幹嘛還是什麼都不做都行,完全交給開發人員自己決定)。而在nginx中,它自己編寫了**處理當我接到usr1訊號的時候,讓nginx重新開啟日誌檔案。具體原理如下:

1、nginx 的主程序收到usr1訊號,會重新開啟日誌檔案(以nginx配置檔案中的日誌名稱命名,就是配置檔案中access_log項所設定的值,如果檔案不存在,會自動建立乙個新的檔案***.log)。

2、然後把日誌檔案的擁有者改為「工作程序(worker程序)」,目的是讓worker程序就具備了對日誌檔案的讀寫許可權(master和worker通常以不同使用者執行,所以需要改變擁有者)。

3、nginx主程序會關閉重名的日誌檔案(也就是剛才使用mv命令重新命名成***.log_ 20130909.log的檔案),並通知工作程序使用新開啟的日誌檔案(剛才主程序開啟的檔案***.log)。具體實現上更細化點就是,主程序把usr1訊號發給worker,worker接到這個訊號後,會重新開啟日誌檔案(也就是配置檔案中約定的***.log)

***********************************定時執行指令碼

設定上面的shell指令碼檔案加入到定時任務中去。crontab是linux下面乙個定時任務程序。開機此程序會啟動,它每隔一定時間會去自己的列表中看是否有需要執行的任務。

crontab  -e

* 04 * * 1 /data/wwwlogs/nginx_log_division.sh

會開啟乙個檔案,加入上面的**

格式為 "分 時 日 月 星期幾  要執行的shell檔案路徑"。用*可以理解成「每」,每分鐘,每個小時,每個月等等。

我設定是在周一凌晨4點執行nginx_log_division.sh指令碼,指令碼的內容就是重新生成乙個新的日誌檔案。

附:設定nginx日誌的配置方法

#第二個引數表示使用那個日誌格式,為每乙個日誌格式標識了乙個名稱,site對應的就是log_format中的名稱

以上涉及到crontab定時任務管理器的使用知識。

nginx自動切割日誌訪問檔案指令碼

bin bash this script run at 00 00 the nginx logs path logspath var log nginx cd logspath mv error log error log.date d yesterday y m d files ls access...

NGINX訪問日誌和日誌切割

當我們訪問nginx服務時,nginx會記錄日誌,nginx日誌分兩種,一種是訪問日誌,一種是錯誤日誌,訪問日誌記錄在 access.log 檔案中,錯誤日誌記錄在 error.log 檔案中 編譯安裝了nginx,預設情況下,access.log日誌會放在nginx安裝路徑的logs目錄中 roo...

nginx訪問日誌的切割

設定日誌定期擷取一是為了方便查閱,二是為了i o擁塞 截止到目前筆者維護過的伺服器中單台伺服器日訪問日誌大小就達到1.6g,如果不定期擷取,由於檔案內容較大,後期對檔案程序查詢 移動時將會嚴重影響系統效能 nginx日誌格式不像apache resin那麼人性化,nginx訪問日誌無法在nginx的...