Python接口自動化之logging日志


在上一篇Python接口自動化測試系列文章:Python接口自動化之pymysql數據庫操作

主要介紹pymysql安裝、操作流程、語法基礎及封裝操作數據庫類。

 

以下主要介紹日志相關概念及logging日志模塊的操作流程。

 

image

 

 

一 日志介紹

01 為什么需要日志?

代碼需要經歷開發調試審查測試或者上線等不同階段,在開發時想要打印的信息類型可能和上線后想看到的信息類型完全不同。也就是說,在“測試”時,可能只想看警告和錯誤信息,然而在“調試”時,可能還想看到跟調試相關的信息。

 

如果你想打印出使用的模塊以及代碼運行的時間,那么代碼很容易變得混亂。使用logging日志模塊,這些問題就能很容易地解決。

 

02 什么是日志?

日志就是用於記錄系統運行時的信息,對一個事件的記錄,也稱為Log。

 

03 日志的用途是什么?

日志的基本用途如下:

  • 記錄程序運行過程中的錯誤,方便跟蹤定位問題,減少調試和維護成本;
  • 通過日志能還原整個程序的執行過程,能了解程序的整體狀態;
  • 對用戶行為分析和數據統計,知曉信息來自於哪個模塊;
  • 在設計測試框架的時候,也可以通過設計日志來記錄框架的整個測試流程;

 

04 日志的級別分為哪些?

常見日志等級,如下:

  • DEBUG:調試級別(Value=10),打印非常詳細的日志信息,通常僅在Debug時使用,如算法中每個循環的中間狀態;
  • INFO:信息級別(Value=20),打印一般的日志信息,突出強調程序的運行過程 ,主要用於處理請求或者狀態變化等日常事務;
  • WARNING:警告級別(Value=30),打印警告日志信息,表明會出現潛在錯誤的情形,如某些預期之外的情況發生或者在將來可能發生什么,此情況一般不會影響軟件的正常實用,如用戶登錄密碼錯誤;
  • ERROR:錯誤級別(Value=40),打印錯誤異常信息,該級別的錯誤可能會導致系統的一些功能無法正常使用,如IO操作失敗或者連接問題;
  • CRITICAL:嚴重錯誤(Value=50),一個嚴重的錯誤,導致系統可能無法繼續運行,如內存耗盡、磁盤空間為空,一般很少使用;

 

05 日志功能的實現

幾乎所有開發語言都會內置日志相關功能,或者會有比較優秀的第三方庫來提供日志操作功能,比如:log4jlog4php等。它們功能強大、使用簡單。Python自身也提供了一個用於記錄日志的標准庫模塊——logging

 

 

二 Logging模塊

01 logging模塊介紹

logging模塊是Python內置的標准模塊,主要用於輸出運行日志,可以設置輸出日志的等級日志保存路徑日志文件回滾等。

02 logging模塊優勢

相比print,具備如下優點:

  • 可以在 logging 模塊中設置日志等級,在不同的relase版本(如開發環境、生產環境)上通過設置不同的輸出等級來記錄對應的日志,只輸出重要信息,而不必顯示大量的調試信息;
  • print 的輸出信息都會輸出到標准輸出流中,嚴重影響開發者從標准輸出中查看其它數據,而 logging 模塊更加靈活,可以設置輸出到任意位置,如寫入文件、寫入遠程服務器等;
  • logging 模塊具有靈活的配置和格式化功能,如配置輸出當前模塊信息、運行時間等,由開發者決定將信息輸出到什么地方,以及怎么輸出,相比 print 的字符串格式化更加方便易用。

 

 

03 logging日志框架的組成

  • Logger:日志,暴露函數給應用程序,基於日志記錄器和過濾器級別決定哪些日志有效。

 

  • LogRecord :日志記錄器,將日志傳到相應的處理器處理。

 

  • Handler :處理器, 將(日志記錄器產生的)日志記錄發送至合適的目的地。

 

  • Filter :過濾器, 提供了更好的粒度控制,它可以決定輸出哪些日志記錄。

 

  • Formatter:格式化器, 指明了最終輸出中日志記錄的布局。

 

image

 

 

04 logging函數中的具體參數

  • filename:指定的文件名創建FiledHandler,這樣日志會被存儲在指定的文件中;
  • filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“w”還可指定為“a”;
  • format:指定handler使用的日志顯示格式;

  • datefmt:指定日期時間格式;
  • level:設置rootlogger的日志級別;
  • stream:用指定的stream創建StreamHandler;

 

 

05 簡單的日志小例子

我們試着分別輸出一條不同日志級別的日志記錄:

import logging logging.debug("This is a debug log.") logging.info("This is a info log.") logging.warning("This is a warning log.") logging.error("This is a error log.") logging.critical("This is a critical log.")

 

輸出結果為:

WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log.

 

為什么debug、info級別日志沒輸出呢?logging模塊提供的默認的日志級別是WARNING,所以只輸出了WARNING及以上的日志級別。

 

輸出內容格式說明:日志級別:日志器名稱:日志內容, 如果未自定義日志器名稱,默認是root。

以下是源碼:

def getLogger(name=None):  """  Return a logger with the specified name, creating it if necessary.  If no name is specified, return the root logger.  """  if name:  return Logger.manager.getLogger(name)  else:  return root

 

 

06 自定義logger日志

設置日志收集器及級別:

# 定義一個日志收集器 logger = logging.getLogger('ITester') # 設置收集器的級別,不設定的話,默認收集warning及以上級別的日志 logger.setLevel('DEBUG')

 

設置日志格式:

fmt =logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s')

 

 

常見的日志輸出格式:

image

 

設置日志處理器-輸出到文件:

# 輸出到文件 file_handler = logging.FileHandler('../log/mylog.txt') # 設置日志處理器級別 file_handler.setLevel("DEBUG") # 處理器按指定格式輸出日志 file_handler.setFormatter(fmt)

 

 

在項目下新建一個文件夾log,在文件夾下新建文件mylog.txt用於存放日志。

image

 

設置日志處理器-輸出到控制台:

# 輸出到控制台 ch = logging.StreamHandler() # 設置日志處理器級別 ch.setLevel("DEBUG") # 處理器按指定格式輸出日志 ch.setFormatter(fmt)

 

收集器和處理器對接,指定輸出渠道:

# 日志輸出到文件 logger.addHandler(file_handler) # 日志輸出到控制台 logger.addHandler(ch)

 

logger日志大致流程圖,如下:

image

 

我們將以上獨立的介紹糅合到一起,測試功能是否正常。在common目錄下,新建文件logger_handler.py。

import logging # 定義一個日志收集器 logger = logging.getLogger('ITester') # 設置收集器的級別,不設定的話,默認收集warning及以上級別的日志 logger.setLevel('DEBUG') # 設置日志格式 fmt =logging.Formatter('%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s') # 設置日志處理器-輸出到文件 file_handler = logging.FileHandler('../log/mylog.txt') # 設置日志處理器級別 file_handler.setLevel("DEBUG") # 處理器按指定格式輸出日志 file_handler.setFormatter(fmt) # 輸出到控制台 ch = logging.StreamHandler() # 設置日志處理器級別 ch.setLevel("DEBUG") # 處理器按指定格式輸出日志 ch.setFormatter(fmt) # 收集器和處理器對接,指定輸出渠道 # 日志輸出到文件 logger.addHandler(file_handler) # 日志輸出到控制台 logger.addHandler(ch) if __name__ == '__main__':  logger.debug('自定義的debug日志')  logger.info('自定義的info日志')  logger.warning('自定義的warning日志')  logger.error('自定義的error日志')  logger.critical('自定義的critical日志')

 

控制台輸出效果:

image

 

文件輸出效果:

image

總結:本文主要介紹,日志相關概念及logging日志模塊的操作流程。

 

更多系列文章,可以關注微信公眾號:ITester軟件測試小棧



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM