python 写一个日志读取统计程序

需求: 读取文件夹下面的log文件,然后统计有哪些ip访问了主机的哪个端口
大概日志存放位置和日志格式为


image.png

初步思想:
import os模块
手动输出文件夹名,然后os.listdir(),把文件夹下的文件以列表形式放入,
根据len(listdir)依次遍历,拼接log文件路径,os.path.join(文件夹,文件名)
用os.isfile判断是否是文件,是的话readlines()
这里读取的时候遇到一个BUG,转码问题,open(encoding='ISO-8859-1'),加上即可

import re
import os

# def write_ip(ip):
#     with open('test.txt', 'a') as f:
#         for i in ip:
#             f.write(i + ' ')
# def write_port(port):
#     with open('test.txt', 'a') as f:
#         for p in port:
#             f.write(p + '\n')
#
# with open('project/u_ex191011.log', 'r') as f:
#     datas = f.readlines()
#     for data in datas:
#         if data:
#             # print(data)
#             # print(re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", data))
#             # print(re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data))
#             ip = re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data)
#             write_ip(ip)
#             # print(re.findall(r"\s(\d{1,5})\s\-", data))
#             port = re.findall(r"\s(\d{1,5})\s\-", data)
#             write_port(port)

def logs_ip_port_sup(dir):
    rootdir = dir
    # 把文件夹下的文件放进列表中
    list1 = os.listdir(rootdir)
    dict_ip_port = {}
    for i in range(0, len(list1)):
        # 拼接路径
        path = os.path.join(rootdir, list1[i])
        print(path)
        # 判断是文件才执行
        if os.path.isfile(path):
            with open(path, 'r', encoding="ISO-8859-1") as f:
                datas = f.readlines()
                for data in datas[:20]:
                    if data:
                        # print(data)
                        # print(re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", data))
                        # print(re.findall(r"\b[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\b", data))
                        ip = re.findall(r"\s[0-2][0-9]{0,2}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\s", data)
                        # write_ip(ip)
                        # print(re.findall(r"\s(\d{1,5})\s\-", data))
                        port = re.findall(r"\s(\d{1,5})\s\-", data)
                        # write_port(port)
                        ip_port = ip + port
                        # print(ip+port)
                        # 判断是否为空,去除头4条空列表
                        if ip_port != [] and len(ip_port) == 3:
                            # 如果端口存在,直接添加访问的ip
                            # print(ip_port)
                            if ip_port[2] in dict_ip_port.keys():
                                if ip_port[1] not in dict_ip_port[ip_port[2]]:
                                    dict_ip_port[ip_port[2]].append(ip_port[1])
                            # 如果端口不存在,在字典中添加端口(key),并添加ip(vaule)
                            else:
                                dict_ip_port[ip_port[2]] = []
                                dict_ip_port[ip_port[2]].append(ip_port[1])

    # 结果为 {端口:[访问ip]}
    print(dict_ip_port)

看你需要什么格式.我这把格式定为,{port:[ip1,ip2,ip3.......]}
就可以满足需求,主机哪个端口,有哪些ip过来访问,并且去重.

{'8701': [' 192.168.8.124 ', ' 192.168.14.101 ', ' 10.49.91.37 ', ' 192.168.14.105 ']}

最后可以把字典输出成一个txt

def output_txt(dict_ip_port, rootdir):
    with open('result-{}.txt'.format(rootdir), 'w') as f:
        for port, list_ip in dict_ip_port.items():
            f.write(port + ':' + '\n')
            for ip in list_ip:
                f.write(ip + '\n')

希望大神能够给予批评,谢谢啦

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,475评论 0 9
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小明yz阅读 2,869评论 0 8
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,790评论 0 10
  • Day05的课程要点记录详细教程地址:Day5 - 常用模块学习 | 第四篇:模块 一、模块介绍 1.1 定义 模...
    乘风逐月阅读 463评论 0 1
  • 晚上夜跑一小时,出汗,身体排气舒服,遗憾定小目标没完成,看书完成。
    杨琴一阅读 139评论 0 0