在應用中記錄日誌是程式開發的重要一環,也是除錯的重要工具。但卻很容易讓人忽略。之前用flask寫的乙個服務就因為沒有處理好日誌的問題導致線上的錯誤難以察覺,修復錯誤的定位也很困難。最近恰好有時間可以梳理一下python日誌的功能,下面是一點筆記。
python標準庫中提供了記錄日誌的方案。
import logging
from logging.config import dictconfig
logger = logging.getlogger(__name__)
# 定義格式
formatter = logging.formatter(fmt='%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
# 定義日誌處理器
streamhdl = logging.streamhandler()
# 設定日誌級別
streamhdl.setlevel(logging.debug)
# 設定日誌格式
streamhdl.setformatter(formatter)
# 給日誌器新增日誌處理器
logger.addhandler(streamhdl)
# 記錄日誌
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
從上面的演示這個模組的使用是比較簡單的。但在應用中深入使用有些需要注意的地方:
parent logger / child logger
在多模組程式中使用多個模組是很常見的,被引用模組中的日誌物件容易讓人迷惑。我們知道乙個應用有乙個唯一的檔案入口,如果這個入口檔案中定義了logger,那這個logger就是parent logger, 其中被匯入的模組中定義的logger就是child logger, 與我們常見的在乙個模組中例項化使用不同,在每乙個需要記錄日誌的地方都需要產生乙個logger,然後進行日誌記錄操作。每個模組內部所記錄的日誌根據每個logger的配置資訊對日誌進行操作,然後根據該logger是否反向傳遞到parent logger進一步操作。反向傳遞到parent logger之後,依舊像普通的logger一樣對日誌進行處理。
日誌的配置
每個logger都可以通過ini檔案、yarm檔案、物件等形式進行配置,這裡主要講以字典形式進行的配置。
logging_config = dict(
version=1,
formatters=
}, handlers=
}, root=,
)dictconfig(logging_config)
當在乙個檔案中使用dictconfig,就給該檔案的logger定義了配置。
異常的捕捉
logger.error()與logger.exception()之間的區別在於error()只會列印一句話,而exception()則會將異常的錯誤棧都會列印出來。對於出現**異常的地方,可以使用exception()用作記錄。
普通日誌直接使用logging模組來記錄,應用內不處理日誌的去向,作為事件流統一輸出到標準輸出,採用第三方日誌採集工具進行捕獲和處理。但也不能太絕對,如果外部收集日誌的程式缺少對日誌級別分類,或者對異常記錄缺少必要的支援,就需要內建的模組進行處理。
python日誌模組
logging.debug 10 logging.info 20 logging.warning 30 logging.error 40 logging.critical 50預設級別為warning 預設輸出位置為控制台 import logging logging.basicconfig 可用引...
python 日誌模組
在軟體或者系統發生錯誤時可以通過日誌快速定位到錯誤,從而定位問題,解決問題。logging模組提供的日誌記錄函式所使用的日誌器設定的日誌級別是warning,因此只有warning級別的日誌記錄以及大於它的error和critical級別的日誌記錄被輸出了,而小於它的debug和info級別的日誌記...
python日誌模組
python的日誌模組使用logging,如果想要輸出符合自己的預期,需要重新定義,廢話不多說,直接貼 encoding utf 8 from logging.handlers import timedrotatingfilehandler import logging import osimpor...