apache的日志主要是access_logerror_log,定时有效的将日志进行分割和统计能够减少access_log的大小以及拿到对自己的有用的信息。

一、目的

对access_log进行分割,把每天的数据单独另存为,同时统计每个ip的访问次数(根据实际的需求进行更改)

二、实现

日志拆分的依据有两种:

1、分割主要是每一天的数据进行分割,比如在凌晨0.00,通过date yesterday生成昨天的时间,把分割出来的都作为昨天

2、在access_log中匹配时间,那就得一行一行的处理,比较麻烦,效率低下。

logcut1

主要如下:

1、找到apache的日志文件路径

centos下一般有两种:/var/log/httpd/access_log  或者 /usr/local/apache2/logs/access_log (源代码安装的)

2、移动另存当前日志文件(原来目录下此时被删除)

3、恢复原来目录的日志文件

挂起一次apache即可。

pkill -1 httpd

4、对日志进行分割处理并保存临时文件

本例中保存的样式为 192.168.229.1:40 

冒号链接是为了后面再次分割使用

5、循环处理临时文件的每一行

根据冒号分割每一行得到ip和访问次数。

6、保存到数据库中。

三、脚本


#!/bin/bash
#logcut.sh

yesterday=`date -d yesterday +%Y%m%d`

srclog="/var/log/httpd/access_log"
# httpd 日志文件
dstlog="/mnt/log/httpd/logsbak/access_${yesterday}.log"
# 目标地址
mv $srclog $dstlog
pkill -1 httpd
#需要挂起一次 否则access_log不会自动生成
tmpfile=$$.txt
#对日志进行处理
`cat /mnt/log/httpd/logsbak/access_${yesterday}.log |awk '{print $1}' |sort |uniq -c |awk '{print $2":"$1}'>>${tmpfile}`
#数据库
mysql='mysql -uroot -p123456 -Dtest'
#对临时文件处理
for item in `cat $tmpfile`
do
	ip=`echo ${item}|awk -F: '{print $1}'`
	num=`echo ${item}|awk  -F: '{print $2}'`
	sql="insert into log_count(date,ip,num) values('${yesterday}','${ip}','${num}')"
	$mysql -e "$sql"
done
#删除文件
rm -f $tmpfile
#验证一下
#sql="select * from log_count"
#$mysql -e "$sql"

三、效果