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

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐