该脚本会自动切割/home/wwwlogs/目录下所有的log文件
#!/bin/bash
#自动版日志切割 无需设置
#set the path to nginx log files
log_files_path="/home/wwwlogs/"
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
#set the path to nginx.
nginx_sbin="/usr/local/nginx/sbin/nginx"
#Set how long you want to save
save_days=30
############################################
#Please do not modify the following script #
############################################
mkdir -p $log_files_dir
cd $log_files_path
#cut nginx log files
for d in `ls -f *.log`;do
mv ${log_files_path}${d} ${log_files_dir}/$(date -d "yesterday" +"%Y%m%d")_$d
done
#delete 30 days ago nginx log files
find $log_files_path -mtime +$save_days -exec rm -rf {} \;
$nginx_sbin -s reload
按天分类存储并删除超过7天的日志
脚本内容:
#!/bin/bash
# a nginx access log segmentation shell script
cd /data/wslogs
log_dir="/data/wslogs"
time=`date +%Y%m%d`
nginx_dir="/usr/local/webserver/nginx"
#日志分割,按天分类
website=`ls $log_dir/access* | xargs -n 1 | cut -f 2 -d "."`
for i in $website
do
mkdir -p $log_dir/backup/$time/$i
mv $log_dir/access.$i.log $log_dir/backup/$time/$i/$time.log
done
$nginx_dir/sbin/nginx -s reload
#删除所有超过7天日志。
if [ "`date +%a`" = "Sun" ]; then
all_list=`ls $log_dir/backup | xargs -n 1`
for del in $all_list
do
let results=$time-$del
if [ $results -gt 7 ]; then
rm -fr $log_dir/backup/$del
fi
done
fi
需要注意的是:因为个人需要,Nginx访问日志命名格式必须是access.域名.log,例如:access.www_1987_com.log,域名中原来的点.必须换成其他字符,比如下划线_
代码中的一些位置参数可以根据自己需要修改,修改/etc/crontab文件,加入00 00 * * * root /data/logcron.sh,每天零点执行。
方法三,我们可以不用脚本可以使用简单的配置
1. 定义日志轮滚策略
# vim nginx-log-rotate
view sourceprint?
/data/weblogs/*.log {
nocompress
daily
copytruncate
create
notifempty
rotate 7
olddir /data/weblogs/old_log
missingok
dateext
postrotate
/bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[warning]/data/weblogs/*.log使用通配符时,/data/weblogs/目录下的所有匹配到的日志文件都将切割。如果要切割特定日志文件,就指定到该文件。[/warning]
2. 设置计划任务
# vim /etc/crontab
59 23 * * * root ( /usr/sbin/logrotate -f /PATH/TO/nginx-log-rotate)
这样每天23点59分钟执行日志切割。