nginx切割日誌

wadeson發表於2017-12-26

1、nginx不停服務進行切割日誌:

[root@weblogic scripts]# cat nginx_log.sh 
#!/bin/bash

log_path=/var/log/nginx
YESTERDAY=`date -d "yesterday" +%Y-%m-%d_%S`
nginx_cmd="/usr/sbin/nginx"

/bin/mv ${log_path}/access.log ${log_path}/access.$YESTERDAY.log
/bin/mv ${log_path}/error.log  ${log_path}/error.$YESTERDAY.log

# reopen a new log file
${nginx_cmd} -s reopen

 然後進行定時任務設定,設定在凌晨12點:

[root@weblogic nginx]# crontab -l
0 0 * * * /bin/bash /root/scripts/nginx_log.sh

 測試效果:

[root@weblogic nginx]# ll
總用量 8
-rw-r--r-- 1 nginx root   0 12月 15 02:13 access.2017-12-14_01.log
-rw-r--r-- 1 nginx root   0 12月 15 08:04 access.log
-rw-r--r-- 1 nginx root   0 12月 15 03:09 error.2017-12-14_01.log
-rw-r--r-- 1 nginx root  61 12月 15 08:04 error.log

 關於nginx命令中的幾個訊號處理,請檢視官方文件:http://nginx.org/en/docs/beginners_guide.html

 

2、使用kill命令向nginx主程式傳送一個訊號:

#向nginx主程式傳送USR1訊號,重新開啟日誌檔案,否則會繼續往mv後的檔案寫資料的。原因在於:linux系統中,核心是根據檔案描述符來找檔案的。如果不這樣操作導致日誌切割失敗。

# kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

 所以該切割指令碼如下:

[root@weblogic scripts]# cat nginx_sin.sh 
#!/bin/bash

log_path=/var/log/nginx
YESTERDAY=`date -d "yesterday" +%Y-%m-%d_%S`
nginx_cmd="/usr/sbin/nginx"

/bin/mv ${log_path}/access.log ${log_path}/access.$YESTERDAY.log
/bin/mv ${log_path}/error.log  ${log_path}/error.$YESTERDAY.log

# send a signal
/bin/kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

 執行結果如下:

[root@weblogic nginx]# ll
總用量 8
-rw-r--r-- 1 nginx root   0 12月 15 08:04 access.2017-12-14_49.log
-rw-r--r-- 1 nginx root   0 12月 15 08:28 access.log
-rw-r--r-- 1 nginx root  61 12月 15 08:04 error.2017-12-14_49.log
-rw-r--r-- 1 nginx root   0 12月 15 08:28 error.log

 現在將指令碼放進到crontab定時指令碼中,凌晨12點執行:

[root@weblogic nginx]# crontab -l
0 0 * * * /bin/bash /root/scripts/nginx_sin.sh

 

3、使用logrotate進行切割:

 1、安裝:

yum -y install logrotate

2、配置logrotate:

[root@weblogic logrotate.d]# pwd
/etc/logrotate.d
[root@weblogic logrotate.d]# cat nginx
/var/log/nginx/*log {
    daily
    rotate 10
    dateext
    missingok
    notifempty
    # compress
    delaycompress
    create 640 nginx adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
}

3、配置引數:

/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程式將立即再次讀取其配置並繼續執行。注意:這兩個關鍵字必須單獨成行。

4、檢視logrotate切割日誌的時間:

[root@weblogic logrotate.d]# 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
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

相關文章