Python+Pyqt5开发日志关键字检索工具

项目测试中可能会涉及到日志安全测试,会检索组件打印的系统日志中是否包含敏感信息,如身份证号码、电话号码,明文密码等信息。正常组件较少,且日志量较少时,可通过将日志下载到本地,再通过Ctrl+F的方式进行搜索查看。但是,一旦组件较多,日志文件较多时,此种方式较为耗时,且容易遗漏。

针对以上问题,本文中利用Python+PyQt5开发了一种批量日志关键字扫描的工具,可在工具界面中输入日志文件路径、待检索的关键字、检索结果路径,运行工具后会在相应路径下生成检索结果。下面开始介绍工具开发的整个流程:

1.环境搭建

本人使用Pycharm作为python集成开发环境,其安装介绍步骤在此不再赘述。由于需要对日志检索工具进行可视化,故选择目前Python中较为常用的UI插件包PyQt5。该插件包安装方式较为简单,可直接在Pycharm中进行添加,需安装PyQt5、PyQt5-tools、PyQ5-plugins、PyQt5Designer插件,安装方式如下图:

说明:下载插件包所用的源为Python官方的源,有时网速比较慢存在下载失败的情况,可以新增一个插件包下载源,添加后再下载。这里是添加了清华的源:Simple Indexhttps://pypi.tuna.tsinghua.edu.cn/simple/

添加源的方式为:点击上图中左下角的Manage Repositories按钮,进入源管理页面,点击绿色添加按钮,将清华源链接复制进去保存即可。如下图所示:

 2.逻辑代码编写

本文逻辑代码部分为日志文件关键字检索,主要思路如下:

(1)定义一个日志关键字检索函数,首先读取指定文件夹中的每个日志文件;

(2)定义一个字符串变量log_string,用于存放每个日志文件的所有行;

(3)利用open()方法以只读的方法打开日志文件,并用readline()方法读取日志文件中的所有行。并将读取到的内容赋给变量log_string,组成一个长字符串;

(4)然后利用find()方法对给定的关键字keyword在log_string中查找关键字并返回其在长字符串中的索引位置;

(5)最后根据关键字的索引位置,将log_string中对应索引位置的字符及其后几位(可自定)字符写入txt文件中,作为日志关键字检索结果。

完整的逻辑代码如下,将其封装在一个Log_scanning类中。

'''定义一个日志检索类'''
class Log_scanning:

    ##初始化类属性
    def __init__(self,logs_path, keywords, scan_result_path):

        self.logs_path = logs_path
        self.keywords = keywords
        self.scan_result_path = scan_result_path

    ####日志文件读取----
    def log_scan(self,logs_path, keywords, scan_result_path):
        global end_msg_status
        end_msg_status = 1  ##定义一个全局变量,是否打印结束信息状态值,当触发异常时该值置为0,不打印结束信息

        try:
            dirs = os.listdir(logs_path)

            ##log_string = ""  ##定义一个字符串变量,存日志文件所有行
            # keywords = ["phone", "key", "password"]
            # scan_result_path = "E:/python_pycharm/scan_result_path/"
            os.makedirs(scan_result_path)

            ##读取指定文件夹下的日志文件---
            for file in dirs:
                file_path = logs_path + "/" + file  ###循环从日志存放的文件夹拿每个日志文件
                filename = scan_result_path + "/" + file + "_scan_result.txt"  ####定义对每个日志文件扫描结果存放的路径及扫描结果
                log_string = ""  ##定义一个字符串变量,存日志文件所有行,每次处理完一个日志文件后,初始化该变量,用于下一个循环中将另一个日志文件村委长字符串

                ###以只读的方式打开日志文件。并读取日志文件中的所有行存在变量logs中
                with open(file_path, "r", encoding="utf-8") as f:
                    logs = f.readlines()

                for log in logs:
                    log_string += log.strip()  ###将日志转为一个长字符串

                for keyword in keywords:  ###关键字检索部分,将检索字符中包含的关键字,并将关键字的索引值返回
                    start_index = -1
                    len_keyword = len(keyword)
                    number_keyword = log_string.count(keyword)
                    for i in range(number_keyword):
                        keyword_index = log_string.find(keyword, start_index + 1, len(log_string))
                        with open(filename, "a") as f:
                            f.write(
                                f"{log_string[keyword_index:keyword_index + len_keyword]}:" +
                                f"{log_string[keyword_index + len_keyword:keyword_index + len_keyword + 10]}\n")

        except FileExistsError:
            print("扫描结果文件夹已经存在,请输入一个不存在的子文件夹!")
            my_newsignal = Newsignal()  ##实例化自定义信号类
            my_newsignal.signal_connect()
            end_msg_status = 0  ##触发异常,置为0

        except FileNotFoundError:
            print("日志存放路径不正确,请确认后再执行!")
            my_newsignal = Newsignal()  ##实例化自定义信号类
            my_newsignal.signal_connect_2()
            end_msg_status = 0  ##触发异常,置为0

3.UI界面设计

本文采用PyQt5作为日志关键字检索GUI界面设计工具,PyQt5作为第三方库,具有界面设计控件丰富、界面设计实时展示直观、逻辑代码和GUI代码分离等诸多优点,受到广泛Python用户进行开发GUI界面的喜欢。

按照步骤1.环境搭建步骤中安装好相应的插件包后,在Pycharm页面菜单栏Tools_>External Tools下会出现两个工具(下图1):Qt Designer和PyUIC,点击Qt Designer即可进入Qt设计页面(下图2),进行GUI界面的编辑(控件添加、控件布局),设计好界面后,点击保存,在程序同级目录下会生成XXX.ui文件,鼠标点击选中该文件后,再进入菜单栏Tools_>External Tools选择PyUIC,即可生成与ui文件相同名称的XXX.py文件(下图3),即为对应GUI界面的代码。以上步骤依次如下图所示:

4.程序异常处理

 一般情况下,用户在使用日志检索工具时,会存在日志文件路径输入有误或日志结果文件夹输入不规范的情况,在此种情况下执行程序,程序会跑出异常,导致工具异常退出。为解决以上问题,本文采用Python中的文件异常处理方法:try-except,将程序跑出的异常放在except中,并给出友好提示,使用户知道哪里输入有问题,从而避免工具异常退出的情况。如下图所示:

5.程序打包

运行程序不依赖于Python集成开发环境,需要将代码进行打包处理,生成exe可执行文件,在任何其他windows电脑上都可运行。本文采用Pyinstaller对程序进行打包。首先需安装打包工具Pyinstaller,安装方式主要有两种:一是在windows本地CMD窗口中通过命令:pip install Pyinstaller安装,另一种就是在Pycharm中通过安装插件包的方式进行安装。安装好Pyinstaller后,进入本地CMD切换至代码所在目录下,即可对程序进行打包,打包方式为:

pyinstaller --paths D:/python_pycharm/venv/Lib/site-packages/PyQt5/Qt5/bin -F -w log_scan_v0.4.py

--paths:当程序中依赖其他模块或库文件时,需将该库文件的安装路径加进来,本项目中依赖PyQt5,故将其安装路径加在后面,若待打包的程序未依赖其他包,则无需加参数paths;

-F:将程序打包成一个exe文件;

-w:打包后的程序无命令行窗口,即运行程序时不会出现cmd窗口;

log_scan_v0.4.py:待打包的py程序。

6.结果展示

7.开发过程中所遇到的问题

(1)打包程序完成后,双击运行打包好的exe文件时,出现报错,提示:failed to execute script xxx,详情提示中提示缺少PyQt5模块,原因是PyQt5库文件只装在了Pycharm中的虚拟环境中,还需要在电脑本地中安装PyQt5,cmd打开命令行窗口,执行pip install PyQt5,在本地安装一下PyQt5,并将其安装路径添加至环境变量path中,然后执行打包程序,打包结束后运行正常。

(2)若选择将逻辑代码单独放在一个模块中时,GUI界面代码中进行导入该逻辑代码时,采用from xxx import xxx,需要注意当.py文件作为模块被导入到其他文件中调用,则作为模块的.py文件不能以数字开头命名,同时不能包含小数点(如from log_scan_v0.1 import log_scan会报错),可以用下划线和字母开头。

(3)当想在程序运行的过程中在textedit控件框中实时打印消息,可使用QtGui.QGuiApplication.processEvents() ##实时刷新界面,来使得打印的内容实时显示在窗口中。该种场景为处理密集耗时的事情:即程序有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态。

(4)当想在类中的另一个方法中使用同一个变量时,可通过先在一个方法中利用global的方式来声明全局变量,如:global end_msg_status,然后在另一个方法中便可以使用该变量。本文中使用end_msg_status作为是否打印结束信息(即end_msg方法中的信息)状态值,当触发异常时将该值置为0,不打印结束信息(即不调用end_msg方法)。

8.说明

(1)经测试,该日志关键字检索工具在检索较多较大的日志文件时,检索耗时较长。考虑到代码中读取日志文件时是先将日志中所有行合成一个长字符串,然后再进行关键字检索并返回其索引位置,一定程度上影响其检索性能。后续考虑优化方向为直接对日志文件中的每行进行关键字检索且返回索引并将写入txt文件,从而减少将日志文件合成一个长字符串的操作,对整体检索性能应该能有一定的提升。

(2)另外,目前写入txt文件中的关键字及字符是代码中写死的关键字及其后面10个字符,后续可优化为让用户可以手动输入写入扫描结果文件中的关键字后面的字符的位数。

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值