本文由ilanniweb提供友情贊助,首發於爛泥行天下linux
想要得到更多的文章,能夠關注個人微信ilanniwebnginx
這幾天本身看了下博客的nginx日誌,發現日誌文件發現愈來愈大。web
由於nginx本身不會對日誌文件進行切割,因此打算經過其餘方式進行切割,並且爲了後續能對nginx日誌文件裏面記錄的數據進行分析,因此打算按照天對其進行切割。shell
PS:本篇文章因此的操做是在centos6.5 OS 64bit上進行。ubuntu
切割nginx日誌,咱們能夠經過兩種不一樣的方式進行,分別是:經過logrotate和經過shell腳本。vim
若是是yum方式安裝的nginx,系統默認會自動經過logrotate這個日誌管理軟件,按天進行分割。可是通過屢次測試發現logrotate切割日誌不會按照本身設置的時間點進行分割,這點有點失望。centos
因此不管是yum方式安裝,仍是源碼方式安裝,都建議使用shell腳本方式進行切割日誌。bash
爲了更深刻的學習linux系統,在此也會介紹下logrotate相關的知識點。微信
下面分別對這兩種方法進行介紹下:dom
前面說了yum或者apt-get方式安裝的nginx會自動使用logrotate這個日誌管理軟件進行切割,因此本章節咱們主要介紹有關logrotate相關的知識點。
logrotate是什麼呢?它是一個linux系統日誌的管理工具。它能夠切割、壓縮等其餘軟件的日誌文件軟件。
logrotate是基於crontab運行的,因此這個時間點是由crontab控制的,具體能夠查詢crontab的配置文件/etc/anacrontab。
咱們能夠經過以下命令安裝logrotate,以下:
yum -y install logrotate
若是是ubuntu系統,可使用以下命令進行安裝:
apt-get -y install logrotate
查看logrotate的配置文件,使用以下命令:
rpm -ql logrotate
經過上圖,咱們能夠很明顯的看到logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用於存儲其餘配置文件的目錄。該目錄裏的全部文件都會被主動的讀入 /etc/logrotate.conf中執行。
logrotate配置選項相對來講比較少,爲了切合本篇文章,在此咱們以切割nginx的配置文件爲例,以下:
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 7
dateext
# compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
在該配置文件中,每一個參數做用以下:
/var/log/nginx/爲nginx日誌的存儲目錄,能夠根據實際狀況進行修改。
daily:日誌文件將按天輪循。
weekly:日誌文件將按周輪循。
monthly:日誌文件將按月輪循。
missingok:在日誌輪循期間,任何錯誤將被忽略,例如「文件沒法找到」之類的錯誤。
rotate 7:一次存儲7個日誌文件。對於第8個日誌文件,時間最久的那個日誌文件將被刪除。
dateext:定義日誌文件後綴是日期格式,也就是切割後文件是:xxx.log-20160402.gz這樣的格式。若是該參數被註釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式。
compress:在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮。
delaycompress:老是與compress選項一塊兒用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循週期進行。這在你或任何軟件仍然須要讀取最新歸檔時頗有用。
notifempty:若是是空文件的話,不進行轉儲。
create 640 nginx adm:以指定的權限和用書屬性,建立全新的日誌文件,同時logrotate也會重命名原始日誌文件。
postrotate/endscript:在全部其它指令完成後,postrotate和endscript裏面指定的命令將被執行。在這種狀況下,rsyslogd進程將當即再次讀取其配置並繼續運行。注意:這兩個關鍵字必須單獨成行。
logrotate切割時間默認是在天天的3:22。這個時間點能夠經過crontab配置文件查看到。以下:
cat /etc/anacrontab
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
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
其中START_HOURS_RANGE參數就是配置logrotate切割的時間點。
若是你想在指定時間點,讓logrotate切割日誌的話,能夠修改此配置文件的START_HOURS_RANGE參數。
可是通過屢次實驗,我發現logrotate沒有按照我指定的時間進行切割日誌。
因此最後我仍是選擇了使用shell腳原本切割nginx日誌。
使用shell腳本切割nginx日誌很簡單,shell腳本內容以下:
vim /usr/local/cut_del_logs.sh
#!/bin/bash
#初始化
LOGS_PATH=/var/log/nginx
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
#按天切割日誌
mv ${LOGS_PATH}/ilanni.com.log ${LOGS_PATH}/ilanni.com_${YESTERDAY}.log
#向nginx主進程發送USR1信號,從新打開日誌文件,不然會繼續往mv後的文件寫數據的。緣由在於:linux系統中,內核是根據文件描述符來找文件的。若是不這樣操做致使日誌切割失敗。
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`
#刪除7天前的日誌
cd ${LOGS_PATH}
find . -mtime +7 -name "*20[1-9][3-9]*" | xargs rm -f
#或者
#find . -mtime +7 -name "ilanni.com_*" | xargs rm -f
exit 0
該shell腳本有兩個功能,第一個是切割nginx日誌,第二個是刪除7天以前的nginx日誌。
在切割nginx日誌的功能中,咱們要注意該shell腳本命名切割的日誌是以切割時,是之前一天的時間就行命名該日誌文件的。
因此咱們在把該shell腳本放在crontab中執行時,建議在天天的0點0分執行。以下:
vim /etc/crontab
0 0 * * * root /bin/sh /usr/local/cut_del_logs.sh
查看nginx切割的日誌文件,以下:
ll --full-time /var/log/nginx/
經過上圖,咱們能夠很明顯的看到,切割shell腳本確實按照咱們設想的進行切割和命名切割日誌文件的。