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

【Python自動化測試19】日志系統logging講解

編輯:Python

文章目錄

  • 一、前言
  • 二、logging日志系統
    • 2.1 什麼是日志?
    • 2.2 為何自動化測試人員也需要學習日志系統?
    • 2.3 日志組成
    • 2.4 日志使用
    • 2.5 日志格式
    • 2.6 日志系統小結

一、前言

本文章主要講解Python中什麼是日志系統、日志系統的使用以及應用的場景等內容,是開發一個自動化測試框架所必須掌握的重點內容,除此之外下方有系列文章的傳送門,還在持續更新中,感興趣的小伙伴也可以前往查看,話不多說,讓我們一起看看吧~

系列文章:
系列文章1:【Python自動化測試1】遇見Python之美
系列文章2:【Python自動化測試2】Python安裝配置及PyCharm基本使用
系列文章3:【Python自動化測試3】初識數據類型與基礎語法
系列文章4:【Python自動化測試4】字符串知識總結
系列文章5:【Python自動化測試5】列表與元組知識總結
系列文章6:【Python自動化測試6】字典與集合知識總結
系列文章7:【Python自動化測試7】數據運算符知識合集
系列文章8:【Python自動化測試8】流程控制語句講解
系列文章9:【Python自動化測試9】函數知識合集
系列文章10:【Python自動化測試10】文件基礎操作
系列文章11:【Python自動化測試11】模塊、包與路徑知識合集
系列文章12:【Python自動化測試12】異常處理機制知識合集
系列文章13:【Python自動化測試13】類、對象、屬性與方法知識合集
系列文章14:【Python自動化測試14】Python自動化測試基礎與進階練習題
系列文章15:【Python自動化測試15】unittest測試框架的核心概念與作用
系列文章16:【Python自動化測試16】測試用例數據分離
系列文章17:【Python自動化測試17】openpyxl二次封裝與數據驅動
系列文章18:【Python自動化測試18】配置文件解析與實際應用

二、logging日志系統

2.1 什麼是日志?

日志又稱之為程序運行日志,日志就好比人們日常寫的日記,日記會記錄一個人當日發生的重大事情或重要事項,能記錄生活的點點滴滴,可以在後續回顧,日志就是記錄程序運行的事項,在某事某刻做了某事,運行了什麼代碼,執行了什麼程序當你的代碼或程序出現問題時,即可通過日志系統來快速查找,以此來定位出現的異常問題並及時解決。

2.2 為何自動化測試人員也需要學習日志系統?

我們通常所見的日志均是開發日志,那為何測試需要學習日志、來寫日志系統?原因很簡單,就是在後續完成測試框架後,我們也需要通過日志系統來判斷我們所寫的框架是否存在問題,這也是我們要學習的原因。

即使你並不是要寫一個測試框架,掌握日志系統也同樣很有必要,它可以用於工具的研發、框架設計,閱讀開發日志等多個方面,也可以用來調試自己的程序。

2.3 日志組成

日志通過三要素組成: 日期、等級、信息,日期則是對應時間,信息則是對應內容,具體的信息也會根據等級進行輸出,其中等級又有不同的級別來對應不同事件:

""" 等級劃分: 1、NOSET --0 等於沒寫,對於日志分析絲毫無用處的一些廢話,類似於日記的流水賬,一些超級普通的事情,每日吃飯、上班等等 2、debug --1 調試內容,一些額外信息,類似於運行程序的一些備注,多用於測試環境的本地調試打印,在測試環境有助於幫助定位問題 3、info --2 主體功能信息,程序在某事某刻做了哪些操作行為,執行了什麼事項,比如接收了一個請求、發送了一個請求等等 4、warning --3 警告級:多用於警示提醒,不影響運行,如果不進行對應的處理修改,在未來的某個時間或某個事件觸發可能會引發程序錯誤 5、error --4 錯誤級:代表程序執行時已產生邏輯或運算錯誤等問題,屬於代碼邏輯缺陷的重要問題,大多數情況下必須解決處理 6、critical --5 致命級:極其嚴重的致命問題,類似於系統崩潰,需要第一優先級及時處理,否則將會嚴重影響程序的運行與邏輯執行 """

2.4 日志使用

日志的使用首先創建一個日志收集器,之後在對應的代碼中寫好對應的日志內容即可,具體用法如下所示:

""" 先展示一下代碼片段 """
def login(username=None, password=None):
if username is None or password is None:
return {
"code": 400, "msg": "用戶名或密碼為空"}
if username == "萌笑天" and password == "123456":
return {
"code": 200, "msg": "登錄成功"}
return {
"code": 300, "msg": "用戶名或密碼錯誤"}
import logging # 日志處理模塊
# 日志收集器,相當於一只筆,收集器參數傳收集器名稱
logger = logging.getLogger("my_logger")
""" 加入日志後 """
def login(username=None, password=None):
if username is None or password is None:
logger.error("登錄失敗,用戶名或密碼為空")
return {
"code": 400, "msg": "用戶名或密碼為空"}
if username == "萌笑天" and password == "123456":
logger.info("登錄成功,正常信息版")
logger.warning("登錄成功,警告版")
return {
"code": 200, "msg": "登錄成功"}
return {
"code": 300, "msg": "用戶名或密碼錯誤"}
login("萌笑天", "123456")

import logging # 日志處理模塊
# 日志收集器,相當於一只筆,收集器參數傳收集器名稱
logger = logging.getLogger("my_logger")
""" 加入日志後 """
def login(username=None, password=None):
if username is None or password is None:
logger.error("登錄失敗,用戶名或密碼為空")
return {
"code": 400, "msg": "用戶名或密碼為空"}
if username == "萌笑天" and password == "123456":
logger.info("登錄成功,正常信息版")
logger.warning("登錄成功,警告版")
return {
"code": 200, "msg": "登錄成功"}
return {
"code": 300, "msg": "用戶名或密碼錯誤"}
login("萌笑天")

從如上代碼以及運行結果可以看出,info級別的日志並沒有打印,而warning的警告級和error的錯誤級有在終端進行輸出,大多數情況下,在正式環境中我們不需要看Debug級日志信息,只會看警告以及錯誤信息,方便快速進行問題的定位。

在真實項目中,終端是用於代碼調試的,故此需要較為詳細的調試信息,而正式的線上環境/生產環境是需要使用文件的形式進行日志存儲,方便事後查看日志進行問題定位,故此在實際的項目中,往往終端日志的級別與實際線上日志的級別等級不一致,通常而言終端為Debug級別,而正式環境是info

默認的日志是有等級控制機制的,故此會出現info未打印,而warningerror會打印的情況,而這一切是由日志收集器進行控制的,當我們設置了默認級別後,那麼就可以根據對應級別進行打印記錄:

import logging # 日志處理模塊
# 日志收集器,相當於一只筆,收集器參數傳收集器名稱
logger = logging.getLogger("my_logger")
# 日期收集器可以控制這個日志的等級,只有高於這個等級的時候才會被記錄,默認級別為warning
logger.setLevel("INFO") # 級別需要大寫
""" 1、流處理器又稱之為終端處理器,還有一個文件處理器 2、中端處理器則是在Pycharm的輸出打印區域所展示的日志結果,文件處理器則是保存至一個txt所記錄的日志結果 """
# 終端處理器
# 只有高於handler級別才會最終顯示
# 最終的顯示結果 需要比較logger 和handler兩者的級別,哪個更高,輸出結果則以哪個為准
handler = logging.StreamHandler()
handler.setLevel("INFO")
logger.addHandler(handler)
""" 加入日志後 """
def login(username=None, password=None):
if username is None or password is None:
logger.error("登錄失敗,用戶名或密碼為空")
return {
"code": 400, "msg": "用戶名或密碼為空"}
if username == "萌笑天" and password == "123456":
logger.info("登錄成功,正常信息版")
logger.warning("登錄成功,警告版")
return {
"code": 200, "msg": "登錄成功"}
return {
"code": 300, "msg": "用戶名或密碼錯誤"}
login("萌笑天", "123456")


一個收集器,可以對應多個處理器,我們也可以輸出至文件,如下圖所示,在終端有結果,也會在一個txt文件中產生結果,結果以追加模式運行,多次執行就多次追加:


2.5 日志格式

新增了日志格式的代碼,先讓我們看下如下的代碼與運行結果:

import logging # 日志處理模塊
# 日志收集器,相當於一只筆,收集器參數傳收集器名稱
logger = logging.getLogger("my_logger")
# 日期收集器可以控制這個日志的等級,只有高於這個等級的時候才會被記錄,默認級別為warning
logger.setLevel("DEBUG") # 級別需要大寫
""" 1、流處理器又稱之為終端處理器,還有一個文件處理器 2、中端處理器則是在Pycharm的輸出打印區域所展示的日志結果,文件處理器則是保存至一個txt所記錄的日志結果 """
# 終端處理器
# 只有高於handler級別才會最終顯示
# 最終的顯示結果 需要比較logger 和handler兩者的級別,哪個更高,輸出結果則以哪個為准
handler = logging.StreamHandler()
handler.setLevel("DEBUG")
logger.addHandler(handler)
# 一個收集器,可以對應多個處理器
file_handler = logging.FileHandler("DEBUG.txt", encoding="utf-8")
file_handler.setLevel("INFO")
logger.addHandler(file_handler)
# 日志格式
fmt = logging.Formatter("%(levelname)s:%(name)s:%(message)s")
# 對處理器設置格式
file_handler.setFormatter(fmt)
""" 加入日志後 """
def login(username=None, password=None):
if username is None or password is None:
logger.error("登錄失敗,用戶名或密碼為空")
return {
"code": 400, "msg": "用戶名或密碼為空"}
if username == "萌笑天" and password == "123456":
logger.info("登錄成功,正常信息版")
logger.warning("登錄成功,警告版")
return {
"code": 200, "msg": "登錄成功"}
return {
"code": 300, "msg": "用戶名或密碼錯誤"}
login("萌笑天", "123456")


看到這裡,想必的大家都清楚格式的作用,日志格式可以為我們提供更詳細的打印信息,以便我們能進行快速檢索、定位,從而高效的分析,高效解決問題,日志的格式也可以使用其他符號代替,也許會更具閱讀性。

具體格式設置與日志系統說明,可以參考Python的官方網站。

# 日志格式
fmt = logging.Formatter("%(levelname)s - %(name)s - %(message)s")
# 日志格式
fmt = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")


2.6 日志系統小結

簡單的總結下日志系統的流程:

""" 1、初始化logger收集器 2、設置收集器的等級 3、初始化handler處理器 4、設置handler等級 5、logger添加handler 6、初始化format日志格式 7、handler添加format 8、logger.info() """
import logging # 日志處理模塊
# 1、初始化logger收集器
# 2、設置收集器的等級
logger = logging.getLogger("收集器")
logger.setLevel("DEBUG")
# 3、初始化handler處理器
# 4、設置handler等級
# 5、logger添加handler
stream_handler = logging.StreamHandler()
stream_handler.setLevel("DEBUG")
logger.addHandler(stream_handler)
file_handler = logging.FileHandler("file_handler.log", encoding="utf-8")
file_handler.setLevel("INFO")
logger.addHandler(file_handler)
# 6、初始化format日志格式
# 7、handler添加format
format_str = "%(asctime)s - %(levelname)s - %(name)s - %(message)s"
fmt = logging.Formatter(format_str)
# 8、logger.info()
logger.debug("調試信息")
logger.info("正常信息")
logger.warning("警告信息")
logger.error("錯誤信息")
logger.critical("崩潰信息")


好啦~以上就是本次文章分享的全部內容啦,你學會了嗎?希望能給大家帶來幫助哦!



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