nginx的日誌切割小知識

2021-09-12 01:34:31 字數 1169 閱讀 7073

今天讀了一篇文章《談談nginx訊號集》

感興趣的同學可以檢視此鏈結

因為知識有限, 其中有段話不是很理解, 最後諮詢才了解原來如此, 希望能對大家有些幫助。

nginx的日誌切割

master 程序收到 sigusr1 後,會重新開啟所有已經開啟的檔案(比如日誌),然後向每個 worker 程序傳送 sigusr1 資訊,worker 程序收到訊號後,會執行同樣的操作。reopen 可用於日誌切割,比如 nginx 官方就提供了乙個方案:

$ mv access.log access.log.0

$ kill -usr1 `cat master.nginx.pid` # 重新開啟日誌檔案

$ sleep 1

$ gzip access.log.0 # do something with access.log.0

複製**

這裡 sleep 1 是必須的,因為在 master 程序向 worker 程序傳送 sigusr1 訊息到 worker 進**正重新開啟 access.log 之間,有一段時間視窗,此時 worker 程序還是向檔案 access.log.0 裡寫入日誌的。通過 sleep 1s,保證了 access.log.0 日誌資訊的完整性(如果沒有 sleep 而直接進行壓縮,很有可能出現日誌丟失的情況)。

看到這段話不懂知識的我眼淚掉下來

具體理解:

問: 我理解的是worker一直會在access.log裡面寫,為什麼又寫到新檔名 access.log.0 呢

mv 只是在檔案系統層面把 access.log 重新命名成了 access.log.0

如果這個時候有程序開啟著 access.log,重新命名後就會向 access.log.0,本質上 fd 指向的檔案是同乙個

**層面,檔案的識別符號是檔案控制代碼 fd

所以需要讓 nginx 重新 close,open 這個 access.log,才會開始寫新的檔案

所以呢,sleep 1;是很有必要的, 可以盡量避免切換日誌檔案(實際是切換fd)過程中,日誌的丟失

希望此文能對大家能有些幫助

nginx日誌切割

web 訪問日誌 access log 記錄了所有外部客戶端對web伺服器的訪問行為,包含了客戶端ip,訪問日期,訪問的url資源,伺服器返回的http狀態碼等重要資訊。一條典型的web訪問日誌如下 規劃 1 要解決問題 2 nignx沒有自動分開檔案儲存日誌的機制。由於nginx它不會幫你自動分檔...

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...