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
)中設定不同的日誌級別,相互配合,實現按業務需求過濾日誌。