簡介
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,具備如下優點:
- 可以通過設定不同的日誌等級,在release版本中只輸出重要資訊,而不必顯示大量的除錯資訊;
- 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和自己封裝一個日誌類!!!