您的位置:首页 > 运维架构 > Shell

shell脚本对apache日志分割并统计保存到数据库

2016-12-05 20:23 609 查看
版权属于: Postbird - There
I am , in the world more exciting!
原文地址: http://www.ptbird.cn/apache-log-cut-count-to-mysql.html
转载时必须以链接形式注明原始出处及本声明。

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


一、目的

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


二、实现

日志拆分的依据有两种:

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

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



主要如下:

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"


三、效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息