你們可能都有管理日誌的須要,好比定時壓縮日誌,或者當日志超過必定大小時就自動分裂成兩個文件等。以前我都是程序裏面自帶的日誌切割功能去實現,好比說apache,而沒有自帶這種功能的程序則寫一個腳本放在定時任務裏面執行,但後來我發現其實Linux自帶的logrotate命令就可以實現這樣的功能,因此今天和你們一塊兒探討研究一下這個很是方便的工具。php
logrotate實用程序旨在簡化系統上日誌文件的管理,從而生成大量日誌文件。 Logrotate容許自動輪換壓縮,刪除和郵寄日誌文件。能夠將Logrotate設置爲天天,每週,每個月或當日志文件達到特定大小時處理日誌文件。node
yum -y install logrotate
logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用於存儲其餘配置文件的目錄。該目錄裏的全部文件都會被主動的讀入 /etc/logrotate.conf中執行。linux
vim /etc/logrotate.conf weekly rotate 4 create dateext include /etc/logrotate.d ls /etc/logrotate.d/ ConsoleKit dracut exim iscsiuiolog nginx php-fpm ppp syslog yum vim /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 個備份nginx
logrotate的切割時間默認是在 /etc/anacrontab 裏面配置的,而START_HOURS_RANGE 就是配置的 logrotate 的執行時間apache
vim /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}'`vim