1. 程式人生 > >nginx之自動日誌切割--請註意這裏不是腳本

nginx之自動日誌切割--請註意這裏不是腳本

nginx 日誌 切割

之前安裝 nginx 都是自己編譯安裝,然後打成 rpm 包。換了一個新公司之後,發現服務器的 nginx 都是 yum 安裝的,這也沒什麽問題,業務量不大。

之後我發現在 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之自動日誌切割--請註意這裏不是腳本