python介面自動化(三十九)- logger 日誌 - 上(超詳解)

巨集哥發表於2019-05-24

簡介

 Python的logging模組提供了通用的日誌系統,可以方便第三方模組或者是應用使用。這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如檔案,HTTP GET/POST,SMTP,Socket等,甚至可以自己實現具體的日誌記錄方式。

        logging模組與log4j的機制是一樣的,只是具體的實現細節不同。模組提供logger,handler,filter,formatter。

  • logger
    提供日誌介面,供應用程式碼使用。logger最長用的操作有兩類:配置和傳送日誌訊息。可以通過logging.getLogger(name)獲取logger物件,如果不指定name則返回root物件,多次使用相同的name呼叫getLogger方法返回同一個logger物件。

  • handler
    將日誌記錄(log record)傳送到合適的目的地(destination),比如檔案,socket等。一個logger物件可以通過addHandler方法新增0到多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。

  • filter
    提供一種優雅的方式決定一個日誌記錄是否傳送到handler。

  • formatter
    指定日誌記錄輸出的具體格式。formatter的構造方法需要兩個引數:訊息的格式字串和日期字串,這兩個引數都是可選的。

  與log4j類似,logger,handler和日誌訊息的呼叫可以有具體的日誌級別(Level),只有在日誌訊息的級別大於logger和handler的級別。

logging模組是Python內建的標準模組,主要用於輸出執行日誌,可以設定輸出日誌的等級、日誌儲存路徑、日誌檔案回滾等;相比print,具備如下優點:

  1. 可以通過設定不同的日誌等級,在release版本中只輸出重要資訊,而不必顯示大量的除錯資訊;
  2. print將所有資訊都輸出到標準輸出中,嚴重影響開發者從標準輸出中檢視其它資料;logging則可以由開發者決定將資訊輸出到什麼地方,以及怎麼輸出

logging模組使用

1 基本使用

配置logging基本的設定,然後在控制檯輸出日誌,

執行時,控制檯輸出,

logging中可以選擇很多訊息級別,如debug、info、warning、error以及critical。通過賦予logger或者handler不同的級別,開發者就可以只輸出錯誤資訊到特定的記錄檔案,或者在除錯時只記錄除錯資訊。

例如,我們將logger的級別改為DEBUG,再觀察一下輸出結果,

控制檯輸出,可以發現,輸出了debug的資訊。

logging.basicConfig函式各引數:

filename:指定日誌檔名;

filemode:和file函式意義相同,指定日誌檔案的開啟模式,'w'或者'a';

format:指定輸出的格式和內容,format可以輸出很多有用的資訊,

引數:作用

%(levelno)s:列印日誌級別的數值
%(levelname)s:列印日誌級別的名稱
%(pathname)s:列印當前執行程式的路徑,其實就是sys.argv[0]
%(filename)s:列印當前執行程式名
%(funcName)s:列印日誌的當前函式
%(lineno)d:列印日誌的當前行號
%(asctime)s:列印日誌的時間
%(thread)d:列印執行緒ID
%(threadName)s:列印執行緒名稱
%(process)d:列印程式ID
%(message)s:列印日誌資訊

datefmt:指定時間格式,同time.strftime();

level:設定日誌級別,預設為logging.WARNNING;

stream:指定將日誌的輸出流,可以指定輸出到sys.stderr,sys.stdout或者檔案,預設輸出到sys.stderr,當stream和filename同時指定時,stream被忽略;

2 將日誌寫入到檔案

2.1 將日誌寫入到檔案

設定logging,建立一個FileHandler,並對輸出訊息的格式進行設定,將其新增到logger,然後將日誌寫入到指定的檔案中,

log.txt中日誌資料為,

2.2 將日誌同時輸出到螢幕和日誌檔案

logger中新增StreamHandler,可以將日誌輸出到螢幕上,

可以在log.txt檔案和控制檯中看到,

可以發現,logging有一個日誌處理的主物件,其他處理方式都是通過addHandler新增進去,logging中包含的handler主要有如下幾種,

handler名稱:位置;作用

StreamHandler:logging.StreamHandler;日誌輸出到流,可以是sys.stderr,sys.stdout或者檔案
FileHandler:logging.FileHandler;日誌輸出到檔案
BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日誌回滾方式
RotatingHandler:logging.handlers.RotatingHandler;日誌回滾方式,支援日誌檔案最大數量和日誌檔案回滾
TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日誌回滾方式,在一定時間區域內回滾日誌檔案
SocketHandler:logging.handlers.SocketHandler;遠端輸出日誌到TCP/IP sockets
DatagramHandler:logging.handlers.DatagramHandler;遠端輸出日誌到UDP sockets
SMTPHandler:logging.handlers.SMTPHandler;遠端輸出日誌到郵件地址
SysLogHandler:logging.handlers.SysLogHandler;日誌輸出到syslog
NTEventLogHandler:logging.handlers.NTEventLogHandler;遠端輸出日誌到Windows NT/2000/XP的事件日誌
MemoryHandler:logging.handlers.MemoryHandler;日誌輸出到記憶體中的指定buffer
HTTPHandler:logging.handlers.HTTPHandler;通過"GET"或者"POST"遠端輸出到HTTP伺服器

2.3 日誌回滾

使用RotatingFileHandler,可以實現日誌回滾,

可以在工程目錄中看到,備份的日誌檔案,

3 設定訊息的等級

可以設定不同的日誌等級,用於控制日誌的輸出,

日誌等級:使用範圍

FATAL:致命錯誤
CRITICAL:特別糟糕的事情,如記憶體耗盡、磁碟空間為空,一般很少使用
ERROR:發生錯誤時,如IO操作失敗或者連線問題
WARNING:發生很重要的事件,但是並不是錯誤時,如使用者登入密碼錯誤
INFO:處理請求或者狀態變化等日常事務
DEBUG:除錯過程中使用DEBUG等級,如演算法中每個迴圈的中間狀態

4 捕獲traceback

Python中的traceback模組被用於跟蹤異常返回資訊,可以在logging中記錄下traceback,

程式碼,

控制檯和日誌檔案log.txt中輸出,

也可以使用logger.exception(msg,_args),它等價於logger.error(msg,exc_info = True,_args),

1 logger.error("Faild to open sklearn.txt from logger.error",exc_info = True)

替換為,

logger.exception("Failed to open sklearn.txt from logger.exception")

控制檯和日誌檔案log.txt中輸出,

 小結

    嘿嘿,又完成了一片,下一篇給小夥伴們介紹一下,有關通過JSON或者YAML檔案配置logging模組、多模組使用logging和自己封裝一個日誌類!!!

相關文章