网上的nginx切割日志的脚本在运用到每个不同的生产环境中时,总是需要大量更改,还容易出错,尤其在处理大量日志的时候。并且有的脚本本身存在很多问题。因此本人自已做了一些修改,在统一设置变量之后,对日志目录的所有.log文件进行切割,切割后的日志保留三个月(工信部要求)。
脚本保存为/root/sh/nginx_cut_log.sh
chmod u+x /root/sh/nginx_cut_log.sh
然后在/etc/crontab中添加:
00 0 * * * root /root/sh/nginx_cut_log.sh >> /root/sh/nginx_cut_log.log 2>&1
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/bin/bash #History ###################################################### #update author #2011 soonyo create #2013/01/17 zhaoyn Improve #2013/02/22 zhaoyn Improve #2013/05/27 zhaoyn compress the log # 00 0 * * * root /root/sh/nginx_cut_log.sh >> /root/sh/nginx_cut_log.log 2>&1 ########## variable ####################################### nginx_dir=/opt/nginx nginx_log_dir=/opt/nginx/logs logs_bakpath=/var/log/nginx year=$(date –d “yesterday” +“%Y”) month=$(date –d “yesterday” +“%m”) delyear=$(date –d “3 months ago” +“%Y”) delmonth=$(date –d ” 4 months ago” +“%m”) deldays=90 cut_log_path=${logs_bakpath}/${year}/${month} export LANG=C export LC_ALL=C export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ####### do ############################################## if [ ! –d “$cut_log_path” ];then mkdir –p ${logs_bakpath}/${year}/${month} fi echo “” echo “” echo “`date` start.” echo “##################################” #### move yesterday logs #### echo “`date` move yesterday logs.” if [ –d “$nginx_log_dir” ]; then cd $nginx_log_dir ls | grep “\.log” | awk –F ‘.log’ ‘{print $1}’ > /tmp/nginxloglist.txt else echo “log backup directory does not exist, exit” exit 1 fi for logfilename in `cat /tmp/nginxloglist.txt` do mv “$logfilename”.log “$cut_log_path”/“$logfilename”_$(date –d “yesterday” +“%Y%m%d”).log gzip “$cut_log_path”/“$logfilename”_$(date –d “yesterday” +“%Y%m%d”).log done #### nginx reopen log #### kill –USR1 `cat ${nginx_dir}/logs/nginx.pid` #or #${nginx_dir}/sbin/nginx -s reopen #### Delete 3 months before the log #### cd “$logs_bakpath”/“$delyear” if [ –d “$delmonth” ];then rm –rf “$delmonth” echo “`date` Delete ${logs_bakpath}/${delyear}/${delmonth}” else echo “`date` Did not delete the directory.” fi if [ –d “$logs_bakpath” ]; then cd $logs_bakpath echo “`date` Deletes the file list.” find $logs_bakpath –maxdepth 3 –type f –name “*.log” –mtime +“$deldays” find $logs_bakpath –maxdepth 3 –type f –name “*.log” –mtime +“$deldays” | xargs rm –rf find $logs_bakpath –maxdepth 3 –type f –name “*.log.gz” –mtime +“$deldays” find $logs_bakpath –maxdepth 3 –type f –name “*.log.gz” –mtime +“$deldays” | xargs rm –rf else echo “`date` Log directory does not exist, exit.” exit fi |
发表回复