67rt 发表于 2016-9-2 09:15:07

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

Python 脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
#_*_coding:utf-8 _*_
__author__ = 'lvnian'

#!/usr/bin env python
# coding: utf-8
import MySQLdb as mysql
import sys, os

db = 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
      url = arr
      status = arr
      # ip url 和status当key,每次统计+1
      dict_list[(ip,url,status)] = dict_list.get((ip,url,status),0)+1
    # 转换成列表
    ip_list = [(k,k,k,v) for k,v in dict_list.items()]
    # 按照统计数量排序,排序后保存到数据库。
    for insert in sorted(ip_list,key=lambda x:x,reverse=True):#如果只想提取前十行的话可以[:10]即可。
      print insert#测试用的,可以不要。整个功能是输出一行,然后保存到数据库。
      sql = 'insert loginfo values ("%s","%s","%s","%s")' % insert
      print sql
      cur.execute(sql)




创建对应的表(在上一篇的基础之上)
python分析nginx日志的ip(来源)

1
2
3
4
5
6
7
8
9
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
);





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

1
2
3
4
5
6
7
8
9
10
11
12
13
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>






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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
#_*_coding:utf-8 _*_
__author__ = 'lvnian'

#!/usr/bin env python
# coding: utf-8
import MySQLdb as mysql
import sys, os,time
import datetime

addtime = 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
      url = arr
      status = arr
      # ip url 和status当key,每次统计+1
      dict_list[(ip,url,status)] = dict_list.get((ip,url,status),0)+1
    # 转换成列表
    ip_list = [(k,k,k,v,addtime) for k,v in dict_list.items()]
    # 按照统计数量排序,排序后保存到数据库。
    for insert in sorted(ip_list,key=lambda x:x,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





数据库修改

1
2
3
4
5
6
7
8
9
10
11
12
数据库增加一个字段
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;   



页: [1]
查看完整版本: python分析nginx日志的ip,url,status