nginx产生的log自动切割,过期自动删除
需求
背景:遇到一个需求:因为nginx每天会产生大量的log,所以需要对这些文件按照每天的日期保存,一段时间后删除年代久远的log.现在成熟的方案是:使用阿里云的ossfs存储桶,将过期的log先转移到存储桶中,超过30天就删除存储桶中的过期log
实现
crontab
crontab -e
在crontab中添加定时执行的脚本文件
59 23 * * * /bin/sh /usr/local/nginxLog.sh
在每天23:59执行该脚本
实现脚本nginxLog.sh
#!/bin/bash
log_dir="/var/log"
move_dir="/nginxLog"
nginx_pid=`ps -ef | grep nginx|grep master|awk -F " " '{print $2}'`
nginx_dir=`ls -l /proc/$nginx_pid/exe |awk -F ">" '{print $2}'`
date_str=`date +%Y%m%d`
move_day=3
save_day=30
dealFile=(`ls $log_dir|grep -E 'access.log|error.log'|awk -F '.log' '{print $1}'`)
inner_ip=$(/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:")
cd $log_dir
#按日期移动文件
file_count=${#dealFile[@]}
for((i=0;i<file_count;i++))
do
file_name=${dealFile[i]}
mv $log_dir/${file_name}.log $log_dir/${file_name}-${date_str}.log
done
$nginx_dir -s reopen
#移动三天后的文件到nginxLog目录
for((i=0;i<file_count;i++))
do
file_name=${dealFile[i]}
find $log_dir -mtime +$move_day -type f -name "*${file_name}-*"| awk -F "/log/" '{print $2}' >> nginx_log_mv.log
done
for move_log_file in $(cat nginx_log_mv.log)
do
mv $log_dir/$move_log_file $log_dir/${inner_ip}-${move_log_file}
mv $log_dir/${inner_ip}-${move_log_file} $move_dir
done
rm -rf nginx_log_mv.log
#删除过期的文件
for((i=0;i<file_count;i++))
do
file_name=${dealFile[i]}
find $move_dir -mtime +$save_day -type f -name "*${file_name}-*" >> ${move_dir}/rm.log
find $move_dir -mtime +$save_day -type f -name "*${file_name}-*" | xargs rm -f
done
说明:
nginx_dir:获取nginx的启动路径,采用动态的方式获取ngnix的执行路径,是脚本更加的通用
dealFile:利用grep和awk获取带有access.log和error.log关键字的文件名,并分割去掉文件中的后缀.log,将其存入到数组dealFile中