项目测试中可能会涉及到日志安全测试,会检索组件打印的系统日志中是否包含敏感信息,如身份证号码、电话号码,明文密码等信息。正常组件较少,且日志量较少时,可通过将日志下载到本地,再通过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_pathself.keywords = keywordsself.scan_result_path = scan_result_path####日志文件读取----def log_scan(self,logs_path, keywords, scan_result_path):global end_msg_statusend_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 = -1len_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  ##触发异常,置为0except 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个字符,后续可优化为让用户可以手动输入写入扫描结果文件中的关键字后面的字符的位数。

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

  1. 使用python+pyqt5开发桌面工具

    环境:python3+pyqt5+qtdesigner 步骤: 1.先用qtdesigner画好图形界面 2.将画好的页面转换为.py文件 pyuic5 -o demo_weather.py demo ...

  2. Python - PyQT5开发UI界面 - 环境搭建

    没有做过UI界面的都会把UI的制作想象的很神秘,我在刚开始的时候也是感觉异常神秘.很复杂.并且无从下手,不过在真正的做出来一个界面后,发现也并没有想象中的那么难,而且做出来可视化的东西所带来的成就感是 ...

  3. python测试开发教程_python3测试工具开发快速入门教程

    现有的优秀python教程大多来自国外,但是翻译过来文章,有些丧失了原意.且现有的python3教程,很少有结合项目能快速上手.为此我们退出为零基础的初学者提供python入门教程(资深python使 ...

  4. linux中下载关键字的日志,linux日志关键字检索处理

    正在做日志筛选数据的事情,需要从服务日志中捞出含关键字的日志,并且该条日志中含响应时间数据,需捞出其中大于500ms的数据Problem 普通的grep只能捞出所有包含关键字的日志,没法做一些简单的逻 ...

  5. python django开发新闻聚合检索推荐_Django查询以检索符合相关选项卡上聚合条件的行...

    我真的被一个Django查询困住了,希望你有几分钟时间来帮我弄清楚.在 我有一个非常简单的模型:class Task(models.Model): # a tuple representing a s ...

  6. 手把手教你写一个基于python+pyqt5的股票盯盘软件

    今天教大家基于Python+pyqt5开发一款股票盯盘小软件,里面含有微信推送.策略分析.回测.实时统计持仓盈亏等功能,其实我们也可以把它叫做股票量化小软件.开发这么一款小软件首先得具备Python的 ...

  7. 可爱的python测试开发库(python测试开发工具库汇总)

    2019独角兽企业重金招聘Python工程师标准>>> 欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 Python测试开发库 参考资料 https://githu ...

  8. 可爱的python测试开发库及项目(python测试开发工具库汇总)

    转载: https://www.jianshu.com/p/ea6f7fb69501 可爱的python测试开发库及项目(python测试开发工具库汇总) github地址 相关书籍下载 Python ...

  9. Python开发Windows桌面应用程序(一)PyCharm+PyQt5开发环境搭建

    前言 最近想开发一套Netty网关日志分析程序,用来分析设备的原始数据.因为网关是放在linux服务器上,之前查看日志是通过Xftp工具将日志下载到本地,然后找到对应的日志数据进行分析. 对于运维人员 ...

最新文章

  1. 脉脉上发匿名消息,拼多多员工被开除了!
  2. 【 MATLAB 】DFS 与 z 变换之间的关系
  3. Redis数据库 安装
  4. TurboMail邮件系统实用技巧十四:如何知道对方已经读信
  5. 移动端输入框弹出键盘控制
  6. LeetCode--20. 有效的括号(栈,删除法)
  7. 入门机器学习(九)--应用机器学习的建议
  8. linux sz rz 下载与上传命令
  9. 【专家有话说】如何用TI-ONE与Angel框架玩转腾讯广告算法大赛?
  10. tomcat等web服务器的工作原理
  11. matlab浪漫画图,Matlab技巧11:谁说数学人不懂浪漫——Matlab画隐函数曲面
  12. 软件工程和数据库中必考的ER图
  13. 设置内外网同时使用,重新配置路由
  14. 浩辰ICAD电气软件IDq2003i.rar
  15. 日程安排工具Calendso
  16. 网络适配器感叹号(代码56)
  17. 真香!取得软考证书可参加通信行业高级职称转评转升
  18. python猜字游戏算法设计_python入门到实践-猜字游戏
  19. 10以内随机加、减法练习题
  20. python公司分析_Python分析6000家破产IT公司

热门文章

  1. IntelliJ IDEA主题设置
  2. pyimgui 中文
  3. 《Axure 流程图》
  4. Xinlinx zynq7020、7045国产替代 FMQL45T900 全国产化 ARM 核心板+扩展板
  5. 360安全卫士qurl.f.360.cn分析
  6. 2023年,“价格杀手”——AI得贤招聘官直接击穿底价,打响招聘管理系统领域价格战的第一枪!
  7. 安全网关与业务网关的区别
  8. TX2安装、配置Qt Creator|完全版
  9. win10更换时间后一直闪屏
  10. 通过微信扫码登录网站流程