Python3 统计Nginx日志里访问次数最多的前十个IP

    xiaoxiao2022-07-02  107

    今天群里有个伙计问,怎么用python统计Nginx日志访问次数前十的IP才能快一些,他表示自己使用的方式是将日志前面的IP全部放在列表中,然后通过列表的count方法来统计的,起初都还好,但是当日志量一大就很慢,问有没有啥好的方法可以解决!

    当然有,可以使用python的字典来加快速度,下面的日志文件是我用代码模拟生成的:

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/5/22 10:27 # @Author : Cooleyes # @File : get_top10.py # @Software: PyCharm # 舞台再大,你不表演,你永远都是观众! # 创建一个空字典用来统计IP出现的次数 ip_count = {} with open('nginx.log') as f: lines = f.readlines() for line in lines: # 通过spilt取得ip ip = line.strip().split()[0] # 如果ip在字典中那么值+1否则在字段中添加ip并赋值为1 if ip in ip_count: ip_count[ip] += 1 else: ip_count[ip] = 1 # 最后使用items方法将字段转成元组的形式,进行排序,取出前十位 # [('192.168.1.1',11), ('192.168.1.2',10), ......] for ip, count in sorted(ip_count.items(), key=lambda x:x[1], reverse=True)[:10]: print(f'{ip} -- {count}')

    以上代码中基本都使用的是基础的一些知识相信大家都能看懂,难一点的地方应该在最后排序那里,sorted函数排序时可以指定一个key参数,key参数必须是一个函数,其中key = lambda x:x[1] 表示使用元组中索引为1的值进行排序,也就是统计出来的次数,我测试的时候使用代码生成了1000 0000条模拟的日志记录,最后大概能在8~9秒内统计出来

    当然聪明的朋友可以把这些代码写成一个函数,方便以后使用!

     

    后来发现linux下可以使用一些命令组合实现这个功能,只是不知道效率如何

    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr -k1 | head -n 10

     

    第一篇博客,如有不足请见谅

     

    最新回复(0)