天天看點

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

這幾天自己看了下部落格的nginx日志,發現日志檔案發現越來越大。

因為nginx自己不會對日志檔案進行切割,是以打算通過其他方式進行切割,而且為了後續能對nginx日志檔案裡面記錄的資料進行分析,是以打算按照天對其進行切割。

ps:本篇文章是以的操作是在centos6.5 os 64bit上進行。

切割nginx日志,我們可以通過兩種不同的方式進行,分别是:通過logrotate和通過shell腳本。

如果是yum方式安裝的nginx,系統預設會自動通過logrotate這個日志管理軟體,按天進行分割。但是經過多次測試發現logrotate切割日志不會按照自己設定的時間點進行分割,這點有點失望。

是以無論是yum方式安裝,還是源碼方式安裝,都建議使用shell腳本方式進行切割日志。

為了更深入的學習linux系統,在此也會介紹下logrotate相關的知識點。

下面分别對這兩種方法進行介紹下:

前面說了yum或者apt-get方式安裝的nginx會自動使用logrotate這個日志管理軟體進行切割,是以本章節我們主要介紹有關logrotate相關的知識點。

logrotate是什麼呢?它是一個linux系統日志的管理工具。它可以切割、壓縮等其他軟體的日志檔案軟體。

logrotate是基于crontab運作的,是以這個時間點是由crontab控制的,具體可以查詢crontab的配置檔案/etc/anacrontab。

我們可以通過如下指令安裝logrotate,如下:

yum -y install logrotate

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

如果是ubuntu系統,可以使用如下指令進行安裝:

apt-get -y install logrotate

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

檢視logrotate的配置檔案,使用如下指令:

rpm -ql logrotate

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

通過上圖,我們可以很明顯的看到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

}

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

在該配置檔案中,每個參數作用如下:

/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切割的時間點。

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

如果你想在指定時間點,讓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

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

該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日志一、使用logrotate切割二、使用shell腳本切割

檢視nginx切割的日志檔案,如下:

ll –full-time /var/log/nginx/

切割nginx日志一、使用logrotate切割二、使用shell腳本切割

通過上圖,我們可以很明顯的看到,切割shell腳本确實按照我們設想的進行切割和命名切割日志檔案的。