千家信息网

python分析nginx日志的ip,url,status

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,Python 脚本如下:#!/usr/bin/env python#_*_coding:utf-8 _*___author__ = 'lvnian'#!/usr/bin env python# cod
千家信息网最后更新 2024年11月23日python分析nginx日志的ip,url,status


Python 脚本如下:

#!/usr/bin/env python#_*_coding:utf-8 _*___author__ = 'lvnian'#!/usr/bin env python# coding: utf-8import MySQLdb as mysqlimport sys, osdb = mysql.connect(user="root",passwd="xxxxx@2015",db="intest",host="192.168.10.12") #数据库连接信息db.autocommit(True)cur = db.cursor()cur.execute('set names utf8')dict_list = {}with open('access.log') as logfin:    for line in logfin:        arr = line.split(' ')        # 获取ip url 和status        ip = arr[0]        url = arr[6]        status = arr[8]        # ip url 和status当key,每次统计+1        dict_list[(ip,url,status)] = dict_list.get((ip,url,status),0)+1    # 转换成列表    ip_list = [(k[0],k[1],k[2],v) for k,v in dict_list.items()]    # 按照统计数量排序,排序后保存到数据库。    for insert in sorted(ip_list,key=lambda x:x[3],reverse=True):#如果只想提取前十行的话可以[:10]即可。        print insert  #测试用的,可以不要。整个功能是输出一行,然后保存到数据库。        sql = 'insert loginfo values ("%s","%s","%s","%s")' % insert        print sql        cur.execute(sql)

创建对应的表(在上一篇的基础之上)

python分析nginx日志的ip(来源)

use intest;show tables; CREATE TABLE `loginfo` (  `ip` text DEFAULT NULL,  `url` longtext DEFAULT NULL,  `status` varchar(200) DEFAULT NULL,  `count_num` varchar(200) DEFAULT NULL);


脚本执行后数据库内看到的结果如下:

mysql> select * from loginfo where count_num >3 limit 5 ;+----------------+-----------------------+--------+-----------+| ip             | url                   | status | count_num |+----------------+-----------------------+--------+-----------+| 121.42.0.85    | /                     | 200    | 39        || 121.42.0.37    | /                     | 403    | 34        || 121.42.0.39    | /                     | 403    | 34        || 222.95.248.220 | HTTP://www.baidu.com/ | 200    | 26        || 23.251.49.10   | www.baidu.com:443     | 400    | 21        |+----------------+-----------------------+--------+-----------+5 rows in set (0.00 sec)mysql>



添加一个时间字段脚本改为如下

#!/usr/bin/env python#_*_coding:utf-8 _*___author__ = 'lvnian'#!/usr/bin env python# coding: utf-8import MySQLdb as mysqlimport sys, os,timeimport datetimeaddtime = datetime.datetime.now()db = mysql.connect(user="root",passwd="xxxx@2015",db="intest",host="192.168.10.12") #数据库连接信息db.autocommit(True)cur = db.cursor()cur.execute('set names utf8')dict_list = {}with open('access.log') as logfin:    for line in logfin:        arr = line.split(' ')        # 获取ip url 和status        ip = arr[0]        url = arr[6]        status = arr[8]        # ip url 和status当key,每次统计+1        dict_list[(ip,url,status)] = dict_list.get((ip,url,status),0)+1    # 转换成列表    ip_list = [(k[0],k[1],k[2],v,addtime) for k,v in dict_list.items()]    # 按照统计数量排序,排序后保存到数据库。    for insert in sorted(ip_list,key=lambda x:x[3],reverse=True):#如果只想提取前十行的话可以[:10]即可。        print insert  #测试用的,可以不要。整个功能是输出一行,然后保存到数据库。        sql = 'insert loginfo values ("%s","%s","%s","%s","%s")' % insert        print sql        cur.execute(sql)#到数据库输出查询如下123.125.160.217 这个ip经常乱***别的服务器曝光一下,如见此ip访问log,请直接拨打911


数据库修改

     数据库增加一个字段        alter table loginfo add time datetime not Null;                or重新建库                CREATE TABLE `loginfo` (         `ip` text,         `url` longtext,        `status` varchar(200) DEFAULT NULL,         `count_num` varchar(200) DEFAULT NULL,        `time` datetime NOT NULL         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;    


0