""" 一、日誌級別 Python 標準庫 logging 用做記錄日誌,默認分爲六種日誌級別(括號爲級別對應的數值), NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)。 咱們自定義日誌級別時注意不要和默認的日誌級別數值相同,logging 執行時輸出大於等於設置的日誌級別的日誌信息, 如設置日誌級別是 INFO,則 INFO、WARNING、ERROR、CRITICAL 級別的日誌都會輸出。 """
""" 二、logging流程 能夠分爲這幾個部分:Logger、LogRecord、Filter、Handler、Formatter。 Logger:即 Logger Main Class,是咱們進行日誌記錄時建立的對象,咱們能夠調用它的方法傳入日誌模板和信息,來生成一條條日誌記錄,稱做 Log Record。 Log Record:日誌記錄器。就代指生成的一條條日誌記錄。將日誌傳到相應的處理器處理 Handler:處理器。即用來處理日誌記錄的類,它能夠將 Log Record 輸出到咱們指定的日誌位置和存儲形式等, 如咱們能夠指定將日誌經過 FTP 協議記錄到遠程的服務器上,Handler 就會幫咱們完成這些事情。 Formatter:格式化器。實際上生成的 Log Record 也是一個個對象,那麼咱們想要把它們保存成一條條咱們想要的日誌文本的話,就須要有一個格式化的過程, 那麼這個過程就由 Formatter 來完成,返回的就是日誌字符串,而後傳回給 Handler 來處理。 Filter:過濾器。另外保存日誌的時候咱們可能不須要所有保存,咱們可能只須要保存咱們想要的部分就能夠了,因此保存前還須要進行一下過濾,留下咱們想要的日誌, 如只保存某個級別的日誌,或只保存包含某個關鍵字的日誌等,那麼這個過濾過程就交給 Filter 來完成。 Parent Handler:Handler 之間能夠存在分層關係,以使得不一樣 Handler 之間共享相同功能的代碼。 """
""" 三、日誌輸出格式 WARRING : ROOT : warn message 日誌級別 logger示例名稱 日誌消息內容 """
""" 四、基本使用 logging 使用很是簡單,使用 basicConfig() 方法就能知足基本的使用須要,若是方法沒有傳入參數,會根據默認的配置建立Logger 對象, 默認的日誌級別被設置爲 WARNING,默認的日誌輸出格式如上圖,該函數可選的參數以下表所示。 filename 日誌輸出到文件的文件名 filemode 文件模式,w[+]、a[+]。清除後寫入,追加寫入 format 日誌輸出的格式 datefat 日誌附帶日期時間的格式 '%m/%d/%Y %I:%M:%S %p' style 格式佔位符,默認爲 "%" 和 「{}」 level 設置日誌輸出級別 stream 定義輸出流,用來初始化 StreamHandler 對象,不能 filename 參數一塊兒使用,不然會ValueError 異常 handles 定義處理器,用來建立 Handler 對象,不能和 filename 、stream 參數一塊兒使用,不然也會拋出 ValueError 異常 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。 %(processName)s:打印線程名稱。 %(module)s:打印模塊名稱。 %(message)s:打印日誌信息。 """
""" 五、發生異常 可是當發生異常時,直接使用無參數的 debug()、info()、warning()、error()、critical() 方法並不能記錄異常信息, 須要設置 exc_info 參數爲 True 才能夠,或者使用 exception() 方法,還可使用 log() 方法,但還要設置日誌級別和 exc_info 參數。 try: c = a / b except Exception as e: # 下面三種方式三選一,推薦使用第一種 logging.exception("Exception occurred") logging.error("Exception occurred", exc_info=True) logging.log(level=logging.DEBUG, msg="Exception occurred", exc_info=True) """
""" 六、自定義Logger 一個系統只有一個Logger對象,而且該對象不能被直接實例化,使用單例模式:獲取Logger對象方法getLogger 這裏的單例模式並非說只有一個 Logger 對象,而是指整個系統只有一個根 Logger 對象,Logger 對象在執行 info()、error() 等方法時 實際上調用都是根 Logger 對象對應的 info()、error() 等方法。 咱們能夠創造多個 Logger 對象,可是真正輸出日誌的是根 Logger 對象 logger = logging.getLogger(__name__) Logger 對象能夠設置多個 Handler 對象和 Filter 對象,Handler 對象又能夠設置 Formatter 對象。 經常使用配置方法: Logger.setLevel() 指定記錄器將處理的最低嚴重性日誌消息,其中 debug 是最低內置嚴重性級別, critical 是最高內置嚴重性級別。 例如,若是嚴重性級別爲 INFO ,則記錄器將僅處理 INFO 、 WARNING 、 ERROR 和 CRITICAL 消息,並將忽略 DEBUG 消息。 Logger.addHandler() 和 Logger.removeHandler() 從記錄器對象中添加和刪除處理程序對象。 Logger.addFilter() 和 Logger.removeFilter() 能夠添加或移除記錄器對象中的過濾器。 """
複製代碼