天天看點

基于Python的Logging子產品記錄程式日志

作者:長頸鹿睡覺

在Python中提供了Logging子產品用來記錄程式日志,既可以輸出到終端,也可以記錄日志到檔案中,非常友善。

使用步驟如下:

擷取Logging對象

首先引入Logging子產品,Logging子產品屬于Python的基礎庫,直接import引入。

import logging           

然後使用getLogger方法擷取日志對象,參數是用于指定日志名稱,可以在日志格式中輸出。

log = logging.getLogger("runner")           

設定日志級别

使用setLevel方法設定日志級别。

可以設定5種級别:DEBUG, INFO, WARNING, ERROR, CRITICAL

log.setLevel(logging.DEBUG)           

設定日志格式

Logging支援如下格式設定:

格式 說明
%(name)s 日志名稱,在logging.getLogger()中傳入的參數
%(levelno)s 5種日志級别的編号
%(levelname)s 5種日志級别的名稱
%(pathname)s 産生日志的程式檔案全路徑
%(filename)s 産生日志的程式檔案名稱
%(module)s 子產品名稱
%(lineno)d 産生日志的代碼行号
%(funcName)s 方法名稱
%(created)f 産生日志的時間,傳回time.time()值
%(asctime)s 産生日志的時間,字元串形式
%(msecs)d 日志時間的毫秒部分
%(relativeCreated)d 日志産生時間相對于程式啟動時間的毫秒內插補點
%(thread)d 線程号
%(threadName)s 線程名稱
%(process)d 進行号
%(message)s 日志資訊

通過logging.Formatter設定日志格式,根據需要自己組合想要的格式

formatter = logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")           

這裡隻是組裝了日志的格式,但還沒有設定給日志,需要通過下面的Handler進行設定。

設定輸出日志到控制台

設定日志通過控制台進行輸出,通過StreamHandler進行設定。

使用StreamHandler.setFormatter方法将上一步的日志格式配置給StreamHandler。

使用addHandler方法,将輸出日志到控制台的Handler添加到log中。

terminal_handler = logging.StreamHandler()
terminal_handler.setFormatter(formatter)
log.addHandler(terminal_handler)           

設定輸出日志到檔案

設定日志輸出到日志檔案中,通過FileHandler進行設定。

FileHandler需要輸入兩個參數,一個是日志檔案的名稱;

一個是寫日志的方式,w是覆寫日志,a是追加日志;

使用FileHandler.setFormatter方法将上一步的日志格式配置給FileHandler。

使用addHandler方法,将FileHandler添加到log中。

file_handler = logging.FileHandler('runner.log', mode='w')
file_handler.setFormatter(formatter)
log.addHandler(file_handler)           

程式中寫日志

Logger提供了debug,info,warning,error,critical 5個方法用來記錄不同級别的日志。

log.info("info")
log.debug("debug")
log.error("error")
log.warning("warning")
log.critical("critical")           

測試

基于Python的Logging子產品記錄程式日志

完整代碼

import logging

log = logging.getLogger("runner")
log.setLevel(logging.DEBUG)

formatter = logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")

terminal_handler = logging.StreamHandler()
terminal_handler.setFormatter(formatter)
log.addHandler(terminal_handler)

file_handler = logging.FileHandler('runner.log', mode='a')
file_handler.setFormatter(formatter)
log.addHandler(file_handler)

log.info("info")
log.debug("debug")
log.error("error")
log.warning("warning")
log.critical("critical")