python logging模塊的使用

logging 專門用於記錄日誌的模塊,相對於print來講,logging 提供了日誌信息的分級、格式化、過濾等功能。在程序中定義豐富有條理的log信息,能夠方便分析程序的運行狀態,在發生問題是可有效定位和分析問題。函數

logging的幾個部分:spa

1. Logger:進行日誌記錄時建立的對象,調用它的方法傳入日誌模板和信息 來生成日誌記錄logRecord線程

2. Handler:用來處理日誌記錄的類,指定輸入日誌位置和存儲形式等debug

3. Formatter:指定日誌的輸出格式,返回字符串給 Handler 處理調試

4. Filter:經過級別或者關鍵字等過濾日誌日誌

5. Parent Handler: Handler 之間存在層級關係,使不一樣的 Handler 間可共享相同功能的代碼code

 

用法:orm

1:默認 Logger 和 basicConfig 格式輸出對象

import logging import time # 返回一個默認的root Logger,默認level=warning,打印內容爲每一個級別的信息
logger = logging.getLogger() # 格式化輸出log信息,返回的是日誌字符串,傳回給 Handler 來處理。
logging.basicConfig( # 指定log級別:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
                    # FATAL:致命錯誤;CRITICAL:內存磁盤空間耗盡等;ERROR:IO操做失敗或鏈接有問題;WARNING:警告不是錯誤;INFO:處理請求或平常狀態變化;DEBUG:調試信息中間狀態等
                    level= logging.ERROR, # 指定保存log信息的文件名稱
                    filename="logging.txt", # 設置文件的讀寫方式
                    # r 只讀、w 建立覆蓋寫入、a 建立追加寫入、
                    # rb 二進制格式打開只讀、wb 二進制建立覆蓋寫入、ab 二進制建立追加寫入、
                    # r+ 打開讀寫、w+ 建立覆蓋讀寫、a+ 建立追加讀寫
                    # rb+ 二進制格式打開讀寫、wb+ 二進制建立覆蓋讀寫;ab+ 二進制追加讀寫
                    filemode="w", # 格式化輸出
                    format=" 日誌時間:%(asctime)s \n"
                           " 日誌級別數值:%(levelno)s \n"
                           " 日誌級別名稱:%(levelname)s \n"
                           " 打印日誌信息:%(message)s \n"
                           " 當前執行程序的路徑:%(pathname)s \n"
                           " 當前執行程序名:%(filename)s \n"
                           " 當前模塊名:%(name)s \n"
                           " 當前執行函數:%(funcName)s \n"
                           " 日誌的當前行號:%(lineno)s \n"
                           " 線程ID:%(thread)d \n"
                           " 線程名稱:%(threadName)s \n"
                           " 進程ID:%(process)d \n"
                           "----------------------------------", # 設置 asctime 的輸出格式
                    datefmt= time.strftime("%Y-%m-%d %X") ) logger.info("info message") logger.debug("debug message") logger.warning("warning message") logger.error("error message") logging.critical("critical error message") """ 運行結果:打印log到logging.txt文件中 日誌時間:2019-03-19 16:23:10 日誌級別數值:40 日誌級別名稱:ERROR 打印日誌信息:error message 當前執行程序的路徑:/Users/soumoemoe/Documents/pyAutoTest/log.py 當前執行程序名:log.py 當前模塊名:root 當前執行函數:<module> 日誌的當前行號:40 線程ID:140735671509888 線程名稱:MainThread 進程ID:42144 ---------------------------------- 日誌時間:2019-03-19 16:23:10 日誌級別數值:50 日誌級別名稱:CRITICAL 打印日誌信息:critical error message 當前執行程序的路徑:/Users/soumoemoe/Documents/pyAutoTest/log.py 當前執行程序名:log.py 當前模塊名:root 當前執行函數:<module> 日誌的當前行號:41 線程ID:140735671509888 線程名稱:MainThread 進程ID:42144 ---------------------------------- """

 

2:Logger、Handler、Formatter、addHandlerblog

import logging import sys # 聲明 logger
logger = logging.getLogger(__name__) # 指定log級別
logger.setLevel(logging.DEBUG) # FileHandler log日誌格式化輸出到文件中
fileHandler = logging.FileHandler("logging.txt") formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") fileHandler.setFormatter(formatter) logger.addHandler(fileHandler) # StreamHandler sys.stderr,sys.stdout 輸出到控制檯
streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) logger.addHandler(streamHandler) logger.info("This is a log info") logger.debug("Debugging") logger.warning("Warning exists") logger.error("Error Message") logger.critical("Critical message")

 

3:Parent Handler,logger配置服用,如下childlog.py複用了log.py文件中Logger的配置,注意兩個文件中 getLogger的參數

#log.py

import logging import sys import childlog logger = logging.getLogger("log") logger.setLevel(logging.DEBUG) streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s") streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) logger.info("Log Info") logger.debug("Log Debug") logger.warning("Log Warning") logger.error("Log Error") logger.critical("Log Critical") childlog.run()
# childlog.py

import logging logger = logging.getLogger("log.childlog") def run(): logger.info("Child Info") logger.debug("Child Debug") logger.error("Child Error")

運行log.py 結果爲:

2019-03-19 17:10:13,951 - log.py - INFO - Log Info 2019-03-19 17:10:13,951 - log.py - DEBUG - Log Debug 2019-03-19 17:10:13,951 - log.py - WARNING - Log Warning 2019-03-19 17:10:13,951 - log.py - ERROR - Log Error 2019-03-19 17:10:13,951 - log.py - CRITICAL - Log Critical 2019-03-19 17:10:13,951 - childlog.py - INFO - Child Info 2019-03-19 17:10:13,951 - childlog.py - DEBUG - Child Debug 2019-03-19 17:10:13,951 - childlog.py - ERROR - Child Error

 

4:異常捕獲,打印Traceback信息:或者用exception打印

list = [1,2] try: for i in range(3): print(list[i]) except Exception: logger.error("訪問列表出錯") """ 運行結果: 2019-03-19 17:16:42,608 - log.py - ERROR - 訪問列表出錯 1 2 """

#----------------------------------------------------------------- # 設置 exc_info = True,會輸出完整的Traceback信息
list = [1,2] try: for i in range(3): print(list[i]) except Exception: logger.error("訪問列表出錯", exc_info = True)
#logger.exception("訪問列表出錯")
""" 運行結果: 2019-03-19 17:18:37,204 - log.py - ERROR - 訪問列表出錯 Traceback (most recent call last): File "/Users/soumoemoe/Documents/pyAutoTest/log.py", line 68, in <module> print(list[i]) IndexError: list index out of range 1 2 """

 

5:Filter 經過Logger名稱過濾log

import logging import sys logger = logging.getLogger("log") streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s") streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) filter = logging.Filter(name = "log.a") streamHandler.addFilter(filter) logging.getLogger("log.a").warning("log.a") logging.getLogger("log.b").warning("log.b") #log.b沒有輸出

""" 運行結果: 2019-03-19 17:33:39,979 - log.py - WARNING - log.a """
相關文章
相關標籤/搜索