1. 程式人生 > 實用技巧 >logging模組簡介python

logging模組簡介python

1 logging模組簡介

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

  1. 可以通過設定不同的日誌等級,在release版本中只輸出重要資訊,而不必顯示大量的除錯資訊;
  2. print將所有資訊都輸出到標準輸出中,嚴重影響開發者從標準輸出中檢視其它資料;logging則可以由開發者決定將資訊輸出到什麼地方,以及怎麼輸出;
Logger從來不直接例項化,經常通過logging模組級方法(Module-Level Function)logging.getLogger(name)來獲得,其中如果name不給定就用root。
名字是以點號分割的命名方式命名的(a.b.c)。對同一個名字的多個呼叫logging.getLogger()方法會返回同一個logger物件。這種命名方式裡面,後面的loggers是前面logger的子logger,自動繼承父loggers的log資訊,正因為此,沒有必要把一個應用的所有logger都配置一遍,只要把頂層的logger配置好了,然後子logger根據需要繼承就行了。 logging.Logger物件扮演了三重角色: 首先,它暴露給應用幾個方法以便應用可以在執行時寫log. 其次,Logger物件按照log資訊的嚴重程度或者根據filter物件來決定如何處理log資訊(預設的過濾功能). 最後,logger還負責把log資訊傳送給相關的handlers.

2 logging模組使用

2.1 基本使用

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

importlogging logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger=logging.getLogger(__name__) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info(
"Finish")

執行時,控制檯輸出,

1 2016-10-09 19:11:19,434 - __main__ - INFO - Start print log
2 2016-10-09 19:11:19,434 - __main__ - WARNING - Something maybe fail.
3 2016-10-09 19:11:19,434 - __main__ - INFO - Finish

logging中可以選擇很多訊息級別,如:DEBUG,INFO,WARNING,ERROR,CRITICAL,通過賦予logger或者handler不同的級別,開發者就可以只輸出錯誤資訊到特定的記錄檔案,或者在除錯時只記錄除錯資訊。

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

1 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

從輸出結果可以看到,輸出了debug的日誌記錄

1 2 3 4 2016-10-0919:12:08,289-__main__-INFO-Startprintlog 2016-10-0919:12:08,289-__main__-DEBUG-Do something 2016-10-0919:12:08,289-__main__-WARNING-Something maybe fail. 2016-10-0919:12:08,289-__main__-INFO-Finish
1 logging.basicConfig函式各引數:
1 2 3 4 5 6 7 8 9 10 11 filename:指定日誌檔名; filemode:和file函式意義相同,指定日誌檔案的開啟模式,'w'或者'a' format:指定輸出的格式和內容,format可以輸出很多有用的資訊, datefmt:指定時間格式,同time.strftime(); level:設定日誌級別,預設為logging.WARNNING; stream:指定將日誌的輸出流,可以指定輸出到sys.stderr,sys.stdout或者檔案,預設輸出到sys.stderr,當stream和filename同時指定時,stream被忽略;  

Formatters定義了Logger記錄的輸出格式。 定義了最終log資訊的內容格式,應用可以直接例項化Foamatter類。資訊格式字串用%(<dictionary key>)s風格的字串做替換。
屬性名稱 格式 說明
name %(name)s 日誌的名稱
asctime %(asctime)s 可讀時間,預設格式‘2003-07-08 16:49:45,896’,逗號之後是毫秒
filename %(filename)s 檔名,pathname的一部分
pathname %(pathname)s 檔案的全路徑名稱
funcName %(funcName)s 呼叫日誌多對應的方法名
levelname %(levelname)s 日誌的等級
levelno %(levelno)s 數字化的日誌等級
lineno %(lineno)d 被記錄日誌在原始碼中的行數
module %(module)s 模組名
msecs %(msecs)d 時間中的毫秒部分
process %(process)d 程序的ID
processName %(processName)s 程序的名稱
thread %(thread)d 執行緒的ID
threadName %(threadName)s 執行緒的名稱
relativeCreated %(relativeCreated)d 日誌被建立的相對時間,以毫秒為單位

2.2 將日誌寫入到檔案

2.2.1 將日誌寫入到檔案

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

1 2 3 4 5 6 7 8 9 10 11 12 13 importlogging logger=logging.getLogger(__name__) logger.setLevel(level=logging.INFO) handler=logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")

 log.txt中日誌資料為:

2017-07-25 15:02:09,905 - __main__ - INFO - Start print log
2017-07-25 15:02:09,905 - __main__ - WARNING - Something maybe fail.
2017-07-25 15:02:09,905 - __main__ - INFO - Finish

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 importlogging logger=logging.getLogger(__name__) logger.setLevel(level=logging.INFO) handler=logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console=logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")

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

2017-07-25 15:03:05,075 - __main__ - INFO - Start print log
2017-07-25 15:03:05,075 - __main__ - WARNING - Something maybe fail.
2017-07-25 15:03:05,075 - __main__ - INFO - Finish

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 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伺服器