『無為則無心』Python日誌 — 66、將日誌資訊儲存到檔案中
阿新 • • 發佈:2022-03-05
目錄
1、把日誌資訊儲存到檔案中
程式碼如下所示:
""" logging模組是Python的內建模組,不需要安裝。 步驟: 1,建立一個把日誌資訊儲存到檔案中的處理器FileHandler 2,把檔案處理器新增到logger中 3,把格式器傳入到檔案處理器中 """ # 匯入logging模組 import logging # 建立一個日誌器,就是一個logger物件 logger = logging.getLogger('logger') # 設定logger輸入級別 logger.setLevel(logging.DEBUG) # 建立日誌格式器 formator = logging.Formatter(fmt="%(asctime)s [ %(filename)s ] %(lineno)d行 | [ %(levelname)s ] | [%(message)s]", datefmt="%Y/%m/%d/%X") # 建立一個輸出的處理器,讓它輸入到控制檯 sh = logging.StreamHandler() # 1.建立一個把日誌資訊儲存到檔案中的處理器 # 要加編碼,不然後可能會亂碼 fh = logging.FileHandler("../log/test_log_01.log", encoding="utf-8") # 把輸出處理器新增到日誌器中 logger.addHandler(sh) # 給處理器新增格式器 sh.setFormatter(formator) # 2.把檔案處理器,載入到logger中 logger.addHandler(fh) # 3.給檔案處理器新增格式器 fh.setFormatter(formator) # 輸出日誌資訊 logger.debug('輸出debug級別的日誌') logger.info('輸出info級別的日誌') logger.warning('輸出warning級別的日誌') logger.error('輸出error級別的日誌') logger.critical('輸出critical級別的日誌')
2、拓展
(1)觀察程式碼
看下面一段程式碼說明問題。
# 主要看標號1,2,3 # 匯入logging模組 import logging # 建立一個日誌器,就是一個logger物件 logger = logging.getLogger('logger') # 1.設定logger日誌器的日誌級別為DEBUG logger.setLevel(logging.ERROR) # 定義日誌處理器File_handler File_handler = logging.FileHandler('../log/all.log', encoding="utf-8") # 2.給日誌處理器File_handler設定日誌級別 File_handler.setLevel(logging.WARNING) # 給處理器傳入格式器 File_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) # 定義日誌處理器console_handler console_handler = logging.StreamHandler() # 3.設定處理器日誌級別 console_handler.setLevel(logging.DEBUG) # 給處理器傳入格式器 console_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s")) # 把兩個處理器新增到日誌器中 logger.addHandler(File_handler) logger.addHandler(console_handler) logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message')
執行結果:
log檔案中日誌:
2021-01-16 23:17:14,149 - ERROR - demo_log3.py[:33] - error message
2021-01-16 23:17:14,150 - CRITICAL - demo_log3.py[:34] - critical message
控制檯中的日誌:
2021-01-16 23:17:14,149 - ERROR - error message
2021-01-16 23:17:14,150 - CRITICAL - critical message
(2)提出問題
在上面程式碼中:
logger
日誌器設定的日誌級別是ERROR。
logger.setLevel(logging.ERROR)
- 檔案日誌處理器
File_handler
設定的日誌級別是WARNING。
File_handler.setLevel(logging.WARNING)
- 控制檯日誌處理器
console_handler
設定的日誌級別是DEBUG。
console_handler.setLevel(logging.DEBUG)
那麼產生疑問:
- 已經對日誌器設定了輸出級別,為什麼還要對日誌處理器的日誌最低輸出級別進行設定呢?
- 日誌器(
logger
)和日誌處理器(handler
)中設定的日誌輸出級別,誰的優先順序更高?
(3)問題說明
- 無論是
logger
例項還是handler
例項,它們都可以設定日誌的最低輸出級別。 logger
日誌器設定的日誌輸出等級優先順序更高,其內部的處理器就不會接收到低於該級別的日誌資訊。
如上面的示例,logger
日誌器設定的輸出級別為ERROR,那麼File_handler
和console_handler
只能接收到ERROR和以上級別的日誌資訊。
所以看上面示例的結果可以看出,File_handler
和console_handler
處理器都只輸出了ERROR級別以上的日誌。
因此在設定各handler
例項輸出級別時需要小心謹慎。- 在實際的應用工作應用過程中,可以在日誌器(
logger
)和日誌處理器(handler
)中設定不同的日誌級別,相互配合,實現按業務需求過濾日誌。