nginx日誌切割shell腳本

1、腳本思路html

第一步就是重命名日誌文件,不用擔憂重命名後nginx找不到日誌文件而丟失日誌。在你未從新打開原名字的日誌文件前,nginx仍是會向你重命名的文件寫日誌,linux是靠文件描述符而不是文件名定位文件。
第二步向nginx主進程發送usr1信號。
nginx主進程接到信號後會從配置文件中讀取日誌文件名稱,從新打開日誌文件(以配置文件中的日誌名稱命名),並以工做進程的用戶做爲日誌文件的全部者。
從新打開日誌文件後,nginx主進程會關閉重名的日誌文件並通知工做進程使用新打開的日誌文件。
工做進程馬上打開新的日誌文件並關閉重名名的日誌文件。
而後你就能夠處理舊的日誌文件了。linux

2、腳本實現nginx

nginx日誌按日期自動切割腳本以下:
bash

?ide

1
2
3
4
5
6
7
8
9
10
11
12
13
#nginx日誌切割腳本
 
#!/bin/bash
#設置日誌文件存放目錄
logs_path= "/usr/local/nginx/logs/"
#設置pid文件
pid_path= "/usr/local/nginx/nginx.pid"
 
#重命名日誌文件
mv ${logs_path}access.log ${logs_path}access_$( date -d  "yesterday" + "%y%m%d" ).log
 
#向nginx主進程發信號從新打開日誌
kill -usr1 ` cat ${pid_path}`


試驗環境:spa

?日誌

1
2
3
4
5
# cat /etc/redhat-release
red hat enterprise linux server release 5.3 (tikanga)
 
# /opt/nginx/nginx -v
nginx version: nginx /1 .6.2

代碼:code

?orm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
# ==============================================================================
# chmod u+x /opt/nginx/cut_nginx_log.sh
# crontab -e
# 0 0 * * * /opt/nginx/cut_nginx_log.sh > /opt/nginx/logs/cut_nginx_log.log 2>&1
# ==============================================================================
 
logs_path= "/opt/nginx/logs"
archive_year=$( date -d  "yesterday" "+%y" )
archive_month=$( date -d  "yesterday" "+%m" )
archive_date=$( date -d  "yesterday" "+%y%m%d_%h%m%s" )
if [ -r  /opt/nginx/nginx .pid ];  then
   mkdir -p  "${logs_path}/${archive_year}/${archive_month}"
   mv "${logs_path}/access.log" "${logs_path}/${archive_year}/${archive_month}/access_${archive_date}.log"
   kill -usr1 $( cat "/opt/nginx/nginx.pid" )
   sleep 1
   gzip "${logs_path}/${archive_year}/${archive_month}/access_${archive_date}.log"
else
   echo "nginx might be down"
fi
 
# ==============================================================================
# clean up log files older than 100 days
# ==============================================================================
 
# change housekeeping=1 to enable clean up
housekeeping=0
keep_days=100
if [ $housekeeping == 1 ];  then
   if [ -d  "${logs_path}" ];  then
     find "${logs_path}" - type f -name  "access_*.log.gz" -mtime +${keep_days} - exec rm -f {} \;
   fi
fi

參考:
http://wiki.nginx.org/logrotationserver

保存以上腳本nginx_log.sh,並設置定時切割任務

3、定時工做
在crontab中設置做業

複製代碼 代碼以下:

0 0 * * * bash /usr/local/nginx/nginx_log.sh


這樣就天天的0點0分把nginx日誌重命名爲日期格式,並從新生成今天的新日誌文件

相關文章
相關標籤/搜索