python分析nginx日志的ip,url,status
admin
2023-06-06 15:01:39
0


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;	


相关内容

热门资讯

闭眼入不踩雷的日常实用手机推荐 在如今快节奏的生活中,选择一款日常使用方便的品牌手机显得尤为重要。它不仅需要满足工作、娱乐、社交等多...
在轨期间将新开展100余项科学... 图表来源:新华社 朱杨柱 张志远 黎家盈 5月23日上午,神舟二十三号载人飞行任务新闻发布会在...
白宫附近枪击嫌疑人身份曝光 新华社华盛顿5月23日电(记者黄强 颜亮)美国媒体23日披露当天在白宫附近向特勤局人员开枪的嫌疑人身...
凤凰专访首位香港航天员黎家盈:... 神舟二十三号载人飞行任务航天员乘组5月23日正式公布,来自香港的黎家盈名列其中。黎家盈在接受凤凰卫视...
神舟二十三号发射在即,发射窗口... 5月16日,神舟二十三号船箭组合体转运至发射区,飞船瞄准2026年5月24日23时08分发射。神舟二...
“青鸟”上街抗议蓝白挡军购?岛... 海峡导报综合报道 美对台140亿美元军售生变,美国代理海军部长曹洪(Hung cao)称,为了确保美...
詹江村赞郑丽文“大方向没有错”... 海峡导报综合报道 国民党主席郑丽文上任后的首次“大考”即2026年“九合一”选举临近,交出何等“成绩...
华为将于今年四季度上市两款智算... 2026年第四季度,华为将基于下一代AI芯片——昇腾950DT,分别推出采用液冷和风冷散热方案的两款...
红领巾薪火传 少年逐梦向阳行—... 大象新闻记者 龚丰硕 通讯员 李静图文 为传承红色精神,延续少先队优良传统,进一步增强少年儿童的荣誉...
斯凯孚申请确定两个链的伸长率的... 国家知识产权局信息显示,斯凯孚公司申请一项名为“确定两个链的伸长率的装置、相关联的双链输送机和方法”...