红联Linux门户
Linux帮助

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

发布时间:2016-09-15 15:11:49来源:linux网站作者:ljihe
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  
到此已经完成!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24181.html