nginx之自動日誌切割--請註意這裏不是腳本
之後我發現在 nginx 的日誌存儲目錄下,日誌都被切割了,這很正常,但是經過我查看,在 crontab 下面並沒有腳本文件進行 nginx 的日誌切割,這
使我有點摸不到頭腦,以我之前的觀念都是腳本進行日誌切割,然後放到定時任務中按天執行。
之後搜索了網上的文章,找到了切割 nginx的日誌是一個服務執行的
服務名: logrotate ,安裝方式: yum -y install logrotate
Ubuntu下安裝方式: apt-get -y install logrotate
不知道是不是自己之前買的雲服務器一般都是最基本的安裝,可能沒有安裝到這個軟件吧
如果是yum方式安裝的nginx,系統默認會自動通過logrotate這個日誌管理軟件,按天進行分割。
查看 logrotate 在服務器中的文件位置
[root@123~]# rpm -ql logrotate /etc/cron.daily/logrotate /etc/logrotate.conf /etc/logrotate.d /usr/sbin/logrotate /usr/share/doc/logrotate-3.7.8 /usr/share/doc/logrotate-3.7.8/CHANGES /usr/share/doc/logrotate-3.7.8/COPYING /usr/share/man/man5/logrotate.conf.5.gz /usr/share/man/man8/logrotate.8.gz
logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用於存儲其他配置文件的目錄。該目錄裏的所有文件都會被主動的讀入 /etc/logrotate.conf中執行。
[root@123~]# ls /etc/logrotate.d/ nginx ppp syslog wpa_supplicant yum
看到配置文件下面有 nginx 的配置文件,內容如下:
[root@123~]# cat /etc/logrotate.d/nginx /var/log/nginx/*log { #為nginx日誌的存儲目錄,可以根據實際情況進行修改 daily #日誌文件將按天輪循 rotate 10 #一次存儲10個日誌文件。對於第11個日誌文件,時間最久的那個日誌文件將被刪除 missingok #在日誌輪循期間,任何錯誤將被忽略,例如“文件無法找到”之類的錯誤 notifempty #如果是空文件的話,不進行轉儲 compress #在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮 sharedscripts #運行postrotate腳本,作用是在所有日誌都輪轉後統一執行一次腳本。如果沒有配置這個,那麽每個日誌輪轉後都會 #執行一次腳本 postrotate #在所有其它指令完成後,postrotate和endscript裏面指定的命令將被執行。在這種情況下,rsyslogd進程將立即再 #次讀取其配置並繼續運行。註意:這兩個關鍵字必須單獨成行 /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || : endscript } daily:日誌文件將按天輪循 weekly:日誌文件將按周輪循 monthly:日誌文件將按月輪循 nocompress:不需要壓縮時,用這個參數 copytruncate:用於還在打開中的日誌文件,把當前日誌備份並截斷 nocopytruncate:備份日誌文件但是不截斷 create mode owner group:轉儲文件,使用指定的文件模式創建新的日誌文件 nocreate:不建立新的日誌文件 delaycompress 和 compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮 nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。 size size 當日誌文件到達指定的大小時才轉儲,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). dateext:定義日誌文件後綴是日期格式,也就是切割後文件是:xxx.log-20160402.gz這樣的格式。如果該參數被註釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式 delaycompress:總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循周期進行。這在你或任何軟件仍然需要讀取最新歸檔時很有用 create 640 nginx adm:以指定的權限和用書屬性,創建全新的日誌文件,同時logrotate也會重命名原始日誌文件。 rotate count 指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
logrotate的切割時間默認是在 /etc/anacrontab 裏面配置的:
START_HOURS_RANGE 就是配置的 logrotate 的執行時間
[root@123~]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
一般使用腳本都是執行完了切割日誌的命令之後是對 nginx 進行平滑重啟,即 reload
下面提供一種新的方法:請在測試環境下測試完成之後在進行生產環境的更改,根據所在環境或者配置不同可能存在差異
#向nginx主進程發送USR1信號,重新打開日誌文件,否則會繼續往mv後的文件寫數據的。原因在於:linux系統中,內核是根據文件描述符來找文件的。如果不這樣操作導致日誌切割失敗。
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
如果你也和我一樣遇到了,日誌自動切割但是並沒有發現定時任務中運行,請收藏此文章。
參考文章:https://www.cnblogs.com/ilanni/p/5365420.html
此文章更為詳細:https://www.cnblogs.com/kevingrace/p/6307298.html
nginx之自動日誌切割--請註意這裏不是腳本