nginx 日志按天分割并定时匹配404访问链接

apache的日志是可以按天来保存的,但nginx没有这个功能,它只会把所有的日志保存在/home/wwwlogs/access.log里面,这样一来,时间长了,日志就会超来越大,而且也会影响日志读写速度及日志的日常维护处理,所以我能想到的就是每天定时把日志数据分割出来,并且把日志里面所有的404访问链接抽取出来放到silian.txt文件,提交到百度处理。


在www文件夹里面创建一个保存nginx日志的文件夹

[root@VM_170_163_centos www]#mkdir -m 0777 nginxlogs

创建一个sh脚本,路径自己决定,我这里是/data/sh/nginx_log.sh

#!/bin/bash

logs_path="/www/wwwlogs/access.log"
logs_bak="/www/nginxlogs/access_$(date -d 'yesterday' +'%Y%m%d').log"
logs_get="/www/nginxlogs/linshi.log"

if [ ! -f $logs_bak ]
then
cp $logs_path $logs_bak
else
cat $logs_path >> $logs_bak
fi

cp $logs_path $logs_get
>$logs_path

##################add 404#############################
silian_path="/www/aaa.com/silian.txt"
set_num=0
set_cre=0

######################################################
sl_arrs=(`cat $silian_path | wc -lc`)
if [ ${sl_arrs[0]} -gt 45000 -o ${sl_arrs[1]} -gt 8388608 ]
then
cp $silian_path "/www/aaa.com/silian$(date +%Y%m%d).txt"
>$silian_path
fi
#####################################################

IFS=$'\n'
for line in `cat $logs_get`
do
{
    lnk=$(expr $line : '.*GET\s\(.*\)\sHTTP\/1.1"\s404.*')
    if [ "$lnk" != "" ]
    then
        #echo -e "http://aaa.com$lnk" | tee -a $silian_path
        echo "http://aaa.com$lnk" >> $silian_path
        let "set_cre = $set_cre + 1"
    fi
    let "set_num = $set_num + 1"
}
done

rm $logs_get
############################################################
logtxt_path='/www/nginxlogs/logs.txt'
logrows=`cat $logtxt_path | wc -l`
if [ $logrows -gt 10000 ]
then
>$logtxt_path
fi
echo "[nginx_log404][$(date +%Y%m%d-%X)]$set_num|$set_cre" >> $logtxt_path
echo "complete!"
echo "$set_num"
echo "$set_cre"

        这个脚本的作用在于复制accss.log文件的内容存放到nginx_log里面,以昨天的日期命名保存,如果昨天的文件已经创建,则直接将内容写到文件后面(此处为了数据量大的时候可能会加大执行频率,例如1小时处理一次),然后将access.log复制到一个临时文件linshi.log,清空access.log文件。

        获取silian.txt的总行数,如果超过了45000或者文件大小超过了8M,则直接备份一份文件,然后清空silian.txt(备注:百度死链接文件提交限制在单个文件不超过50000行或者10M,所以文件限制可以按要求适当处理),接着根据生成临时文件linshi.log的日志文件指定“\n”换行符,循环读取每一行日志数据,然后使用正则匹配404的访问地址,拼接好完整http链接保存到silian.txt文件。其中set_num(日志总条数) 与set_cre(404地址数),处理完成后删除临时文件,临时文件在此处只做过过渡,如果直接读取access.log,我是怕access.log同时也在不断有新的数据写入,会对其它操作有影响。

        把处理后统计出来的数据保存到logs.txt里面,便于查看执行记录及效果,如果执行超过一万次这里就直接清空从新记录。

        分析死链接的目的在于百度收录优化,提升排名,生成的silian.txt文件需要提交给百度。


执行crontab -e 编辑定时任务

加入

1 0 * * * sh /data/sh/nginx_log.sh


到此已经完成!

你可能感兴趣的:(Linux,shell,nginx,脚本,shell,linux,nginx)