1.若日志文件可能存在往日的访问信息,可以运行下面的脚本.
该脚本先判断日志文件中是否存在过往的访问信息,如果存在,先处理这些过往信息。处理方式是按照日期生成文本文档,并写入对应的访问信息。然后清空日志文件,等待新的记录写入。
如果不存在过往访问记录,则直接将该文件按日期重命名,然后通知nginx重新打开日志文件。
说明:如果原始的日志文件非常大,可以先用split命令对文件进行切割,然后再逐个处理切割出来的小文件,以减轻服务器的压力。
#!/bin/bash
#将日志文件中未按日期分割的历史记录进行分割。
#获取日志文件中的日期信息,并将其写入临时文件
log_dir=/opt/access.log
awk '{print $4}' $log_dir | awk -F: '{print $1}' | sed 's/\[//' | sort -u -t/ -k3 -k1 > /opt/log_date.txt
#先判断日志文件中是否存在往期的日志信息,如果存在,先处理历史日志信息。
sum=`wc -l < /opt/log_date.txt`
if [ $sum -gt 1 ];then
#通过for循环,将历史日志记录按日期分别记录到指定的文件内。
for i in `cat /opt/log_date.txt`
do
dir=`echo $i| sed 's#/#-#g' `
grep $i $log_dir >> /opt/a/$dir-access.log
done
> $log_dir
else
dir=`cat /opt/log_date.txt| sed 's#/#-#g' `
mv $log_dir /opt/a/$dir-access.log
kill -USR1 $(cat /var/run/nginx.pid)
#通过USER1信号通知nginx重新打开日志文件
$nginx_sbin force-reload
fi
一个简单的分割脚本
#!/bin/bash
Dateformat=`date +%Y%m%d`
Basedir="/usr/local/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_www"
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload
一个非常耗时的日志分割脚本
cat access.log | while read i a b t c
do
date_dir=`echo $t|sed 's#\[##'|sed 's#\/#-#g'|cut -d: -f1`
echo $i $a $b $t $c >> /tmp/log/$date_dir-log.txt
date=`echo $date_dir| sed 's#-#\.#g'`
sed -i "/$i.*$date/d" access.log
done
评论