Python 脚本如下:
#!/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[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-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[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;
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。