nginx日誌切割

2021-07-10 18:40:17 字數 2602 閱讀 1176

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 日誌切割

直接在nginx配置檔案中,配置日誌迴圈,而不需使用logrotate或配置cron任務。需要使用到 time iso8601 內嵌變數來獲取時間。time iso8601格式如下 2015 08 07t18 12 02 02 00。然後使用正規表示式來獲取所需時間的資料。使用下面的 塊 1 2 3...

Nginx日誌切割

編輯指令碼tianshl tianshl nginx vim nginx log division.sh指令碼內容 bin sh 昨天日期 yesterday date v 1d y m d 日誌目錄 log path usr local var log nginx sdk日誌路徑 sdk path...

Nginx日誌切割

由於 nginx 的日誌都是寫在乙個檔案當中的,因此,我們需要每天零點將前一天的日誌存為另外乙個檔案,這裡我們就將 nginx 位於 logs 目錄中的 access.log 存為 access yyyy mm dd log 的檔案。其實 logs 目錄中還有個 error.log 的錯誤日誌檔案,...