nginx短篇(8):日誌切割
- A+
所屬分類:Nginx 運維技術
博主會將與Nginx有關的知識點總結到"nginx短篇系列"文章中,如果你對nginx不是特別瞭解,請 按照順序 閱讀"nginx短篇系列",以便站在前文的基礎上理解新的知識點。
我們知道,nginx會將訪問日誌寫入到access.log日誌檔案中,天長日久,access.log檔案就會越來越大,如果訪問量巨大,並不用多長時間,access.log檔案的體積就會變得非常大,對於我們的管理工作來說,這是不利的,首先,當我們開啟一個非常大的日誌檔案時,就會比較慢,而且,從一個非常大的日誌中找到某個時間段的日誌也會比較慢,所以,我們最好將日誌按天分割開(或者按照你覺得合適的時間段分隔開),比如,每天晚上0點5分生成一個新的日誌檔案,0點5分之後(新的一天)的日誌寫入到新的日誌檔案中,之前的日誌則保留在老的檔案中,這樣每天就會生成一個日誌檔案,而不是將所有日誌都寫入到同一個日誌檔案中。
所以,我們需要為nginx配置"日誌分割"的功能,或者稱之為"日誌滾動"的功能,說到nginx的日誌切割,要分如下兩種情況來說:
一、通過編譯的方式安裝nginx後,預設沒有日誌分割的功能。
二、通過yum源的方式安裝nginx後,預設會對nginx日誌進行切割。
也就是說,當安裝完nginx以後,預設是否存在日誌滾動的功能,取決於你的安裝方式,看完這篇文章你就會理解為什麼會出現這種情況。
為nginx實現日誌切割的方法通常有兩種,第一種方法是編寫指令碼實現日誌切割,第二種方法是使用系統自帶的日誌滾動軟體"logrotate"完成日誌切割,但是無論選擇哪種方法,其實都是殊途同歸,在本質上都是一樣的,那麼,我們先來看看怎樣通過最"原始"的方法為nginx進行日誌滾動。
在之前的文章中,我們已經瞭解到,通過"nginx -s"命令可以向nginx的主程序(master程序)傳送訊號,這些訊號就是quit訊號、stop訊號、reload訊號以及reopen訊號,其實,我們藉助reopen訊號,就能為nginx實現日誌滾動的效果,此處先演示手動實現日誌滾動的操作,手動操作步驟如下:
一、進入日誌目錄 cd /srv/nginx/logs/ 二、重新命名日誌檔案 此處,假設當前時間為2019年2月12日凌晨0點5分,我想要在這個時間點切割日誌,所謂的"切割",並不是真的把一個檔案"切成兩個",只是把原來的"access.log"檔案重新命名,比如重新命名為昨天的日期"access.log-20190211",然後再建立一個名為"access.log"的新檔案,以便新生成的日誌仍然可以寫入到名為"access.log"的新檔案中,這樣就能實現所謂的"日誌滾動"或者"日誌切割"的效果了。 但是,這樣做會遇到一些問題,我們來手動操作一下,首先,重新命名檔案 # mv access.log access.log-20190211 我們已經重新命名了"access.log"檔案,但是你會發現,重新命名後,nginx日誌仍然會寫入到"access.log-20190211"檔案中,並不會自動建立一個新的"access.log"檔案,即使你手動建立了一個新的"access.log"檔案,nginx仍然會把日誌寫入到重新命名後的"access.log-20190211"檔案中。 出現上述情況,是因為nginx程序讀寫日誌檔案時,是通過檔案描述符去操作的,雖然我們修改了原"access.log"檔案的檔名,但是原檔案描述符與檔案本身的對應關係仍然存在,所以,單單對檔案重新命名是不夠的,我們需要讓nginx重新開啟一個新檔案,以便將新的日誌寫入到新檔案中。 三、傳送訊號 此刻,就需要用到我們剛才提到的reopen訊號了,我們需要向nginx主程序傳送一個reopen訊號,以便nginx能夠開啟一個新的日誌檔案,具體命令如下: # nginx -s reopen 執行完上述命令後,你會發現日誌目錄中自動生成了一個新的"access.log"檔案,再次訪問nginx,會發現新生成的日誌已經寫入到了新生成的"access.log"檔案中了。
如果每天0點5分的時候都執行一遍上述操作,就能夠實現每天日誌自動滾動的效果了,當然,我們需要編寫一個指令碼,將上述過程自動化,然後定時執行指令碼即可,其實上述過程非常簡單,說白了就是重新命名日誌檔案,傳送訊號,生成新的日誌檔案。
其實,除了能夠使用"nginx -s"命令傳送訊號,我們也可以藉助"kill"命令向nginx程序傳送訊號,你肯定經常使用kill命令,當你想要強制停掉程序的時候,會使用"kill -9 pid"向程序傳送"SIGKILL"訊號,除了"-9"代表的"SIGKILL"訊號,我們也可以藉助kill命令向程序傳送一些別的訊號,kill命令並不是此處討論的重點,而是我們需要藉助kill命令,向nginx主程序傳送一個名為"USR1"的訊號,在程式中,"USR1"訊號的作用是可以自定義的,也就是說,當程式捕捉到"USR1"訊號的時候進行什麼操作,取決於程式設計時的設定,不同的程式採取的操作可能不同,而在nginx中,"USR1"訊號可以幫助我們重新開啟日誌,換句話說就是,"nginx -s reopen"命令的作用和"kill -USR1 NginxPid"的作用是一樣的,"NginxPid"指的是nginx的master程序的程序號,所以,在編寫nginx日誌滾動指令碼時,你可以使用這兩個命令中的任何一個,以便nginx可以重新開啟日誌檔案。
如果你使用了yum源的方式安裝了nginx,你會發現在安裝完nginx後預設就有日誌滾動的功能,這是因為通過yum源安裝nginx後,預設會安裝一個日誌滾動的配置檔案,這個配置檔案就是"/etc/logrotate.d/nginx",可以看出,這是一個logrotate配置檔案,也就是說,nginx藉助這個配置檔案,使用logrotate完成了日誌分割的操作,通常情況下,centos系統預設自帶logrotate,logrotate是一個日誌管理工具,此處討論的重點也不是logrotate,重點是nginx怎樣通過logrotate完成日誌滾動的,所以,開啟"/etc/logrotate.d/nginx"配置檔案,你會從中找到如下一行命令
kill -USR1 `cat /var/run/nginx.pid`
看到此處你一定明白了,無論是我們自己編寫指令碼,還是通過別的什麼方式,其實本質上都是在向nginx程序傳送訊號,只是實現的方法不同,本質上是完全一樣的。
好了,關於nginx日誌分割的話題就先寫到這裡,希望能夠對你有所幫助~
我的微信公眾號
關注"實用運維筆記"微信公眾號,當部落格中有新文章時,可第一時間得知哦~