在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")
測試
完整代碼
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")