『無為則無心』Python日誌 — 66、將日誌資訊儲存到檔案中

繁華似錦Fighting發表於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)問題說明

  1. 無論是logger例項還是handler例項,它們都可以設定日誌的最低輸出級別。
  2. logger日誌器設定的日誌輸出等級優先順序更高,其內部的處理器就不會接收到低於該級別的日誌資訊。
    如上面的示例,logger日誌器設定的輸出級別為ERROR,那麼File_handlerconsole_handler只能接收到ERROR和以上級別的日誌資訊。
    所以看上面示例的結果可以看出,File_handlerconsole_handler處理器都只輸出了ERROR級別以上的日誌。
    因此在設定各handler例項輸出級別時需要小心謹慎。
  3. 在實際的應用工作應用過程中,可以在日誌器(logger)和日誌處理器(handler)中設定不同的日誌級別,相互配合,實現按業務需求過濾日誌。

相關文章