Python 內建就有個 logging 的套件 [1],可以使用設定檔來控制 log 的輸出。
不過實務上有一點小地方需要注意。
disable_existing_loggers
這個參數的意思是,當設定被載入的時候,已經既存的 logger 是否要被關閉。
因為預設是 True,也就是既存的 logger 會被關閉,因此會形成如果程式做過兩次以上的設定載入
有可能會發生有些 logger 寫的 log 在第二次載入後,突然就全部消失了的狀況。
而解法是要嘛把這個屬性設成 False,要嘛就要確保 logger 初始化必須在載入設定之後才發生。
後者就是為什麼 [2] 有一個段落標題這樣寫:
Do not get logger at the module level unless disable_existing_loggers is False
使用 YAML 設定檔
官方文件其實建議新的程式應該要用 dictConfig() 來載入設定檔,因為 dictConfig() 的結構能夠提供更靈活的設定方法。
而 dictConfig() 吃的參數是 dictionary,因此如果依照官網範例,使用 YAML 格式來寫設定檔時
需要引用 yaml 套件來讀取、解析 YAML 檔案,然後輸出成 dictionary 的格式,才能正確被 dictConfig() 載入。
假設 YAML 的設定檔內容如下:
version: 1 disable_existing_loggers: False formatters: simple: format: '%(asctime)s | %(name)s | %(levelname)s | %(message)s' handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout loggers: simpleExample: level: DEBUG handlers: [console] propagate: no root: level: DEBUG handlers: [console]
載入設定時,需要使用類似這樣的程式碼:
import yaml with open('logging.yaml', 'r') as fd: config = yaml.safe_load(fd.read()) logging.config.dictConfig(config)
沒有留言:
張貼留言