分析Nginx访问日志及写入数据库

1、  首先读取你的nginx日志文件 ,然后对内容进行分析,这也取决你的在nginx.conf设置的日志文件格式

 

#cp /var/log/nginx/access.log /var/log/nginx/test.log
#cat /var/log/nginx/test.log 

        192.168.232.1 - - [14/Mar/2015:01:12:59 -0700] "GET / HTTP/1.1" 200 2230 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" "-"

 

2、用awk对日志内容进行分组 , 然后从中获取自己需要的数据。

#cat /var/log/nginx/test.log | awk ‘{print $1,$4,$7}’

 

      //经过测试打印查看,$1是ip地址 ,$4是时间 , $7是被访问地址

      //192.168.232.1 [14/Mar/2013:16:50:34 /

3、  写脚本之间先建立数据库 test 库 , 还有存放日志log表

        mysql > create database test;
      mysql > use test;
      mysql > CREATE TABLE log (
              >`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
              >`ip` varchar(15) NOT NULL DEFAULT '127.0.0.1' COMMENT '//客户端ip',
              >`url` varchar(255) NOT NULL DEFAULT '' COMMENT '访问的url',
              >`time` char(20) NOT NULL DEFAULT '' COMMENT '详细时间',
              >`date` int(8) unsigned NOT NULL DEFAULT '0' COMMENT '年月日',
              > PRIMARY KEY (`id`)
              >) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

4、  开始写分析脚本 , nginx_log_to_mysql.sh

 

#vim nginx_log_to_mysql.sh
        #!/bin/bash
      #

      #处理时间[14/Mar/2015:01:12:59成2015-Mar-14 01:12:59
      function unixtime()
      {      
            if [ -n "$!"] ;
            then
                TIME=`echo ${1:1} | awk -F'[:\b/]' '{print $3"-"$2"-"$1" "$4":"$5":"$6}'`
                echo $TIME
            fi
      }

      #存放日志的路径
      LOG_PATH='/var/log/nginx/'

      #有那些日志
      LOGS=('test')

      #处理昨天的日志
      YESTERDAY=`date -d "yesterday" +"%Y-%m-%d"`

      #连接数据库的账号密码及其数据库
      SQLCNT='/usr/local/mysql/bin/mysql -uroot -p123456 test'
      SQL="INSERT INTO log(ip,url,time,date)VALUES"

      #获取当前的时间
      DATE=`date -d "yesterday" +"%Y%m%d"`

      #循环读取所有的日志 , 并进行读取
      for LOG in ${LOGS[@]} ;
      do
            #读取后缀为/ .或者.html 或php的访问文件
            DATA=`/bin/cat "$LOG_PATH$LOG-$YESTERDAY.log" | awk '$7 ~ /(\/$|\.html.*|\.php.*)/ {print $1"--"$4"--"$7}'  `
            #计算器 , 插入的数据超过1000条先提前插入
            I=1
            QRYSQL=''
            for D in ${DATA[@]} ;
            do
                  #将上面时间获取ip—时间—访问的url进行转化为数组
                  DD=(`echo ${D//--/ }`)
                  QRYSQL=$QRYSQL"('${DD[0]}','${DD[2]}','`unixtime ${DD[1]}`','$DATE'),"
                  #超过1000条先插入
                  if [ $I == 1000 ] ;
                  then
                        QRYSQL=$SQL${QRYSQL%%,}";"
                        echo $QRYSQL | $SQLCNT &> /dev/null
                        I=0
                        QRYSQL=''
                  fi
                  I=`expr $I+1`
            done
            if [ -n $WRYSQL ] ; then
                  QRYSQL=$SQL${QRYSQL%%,}";"
                  echo $QRYSQL | $SQLCNT &> /dev/null
            fi
      done 

 

 

5、  将脚本加入到计划任务中

 

    #chmod +x /root/shell/nginx_log_to_mysql.sh
    #crontab –e
    #凌晨0时15分执行
    15 0 * * * /root/shell/nginx_log_to_mysql.sh &> /var/log/nginx_sh.log

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reg183

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值