程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python+Pyqt5開發日志關鍵字檢索工具

編輯:Python

項目測試中可能會涉及到日志安全測試,會檢索組件打印的系統日志中是否包含敏感信息,如身份證號碼、電話號碼,明文密碼等信息。正常組件較少,且日志量較少時,可通過將日志下載到本地,再通過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個字符,後續可優化為讓用戶可以手動輸入寫入掃描結果文件中的關鍵字後面的字符的位數。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved