閱讀Python的logging
庫(2.7版本)的文檔,我碰到下面傳來:爲什麼禁止覆蓋日誌記錄屬性?
Logger.debug(MSG,* ARGS,** kwargs)
[...]第二關鍵字參數是額外的,可用於傳遞一個字典,該字典用於使用用戶定義的屬性填充爲記錄事件創建的LogRecord的
__dict__
。這些自定義屬性可以隨意使用。例如,它們可以合併到記錄的消息中。 [...] 字典中傳遞的鍵不應與記錄系統使用的鍵衝突。 [emph。 mine]
那麼爲什麼這個約束存在?在我看來,這無法從庫中靈活地取消靈活性(開發人員需要檢查哪些鍵是內置的,哪些不是)。
假設你想要寫它記錄一個裝飾功能的入口和出口:
def log_entry_exit(func):
def wrapper(*args, **kwargs):
logger.debug('Entry')
result = func(*args, **kwargs)
logger.debug('Exit')
return result
return wrapper
@log_entry_exit
def foo():
pass
假設你也想記錄的封閉函數的名稱:
format_string = '%(funcName)s: %(message)s'
糟糕!這不起作用。輸出是:
>>> foo()
wrapper: Entry
wrapper: Exit
當然的功能名稱求wrapper
,因爲這是封閉的功能。然而,這不是我想要的。我想打印裝飾功能的功能名稱。因此這將是非常方便的,只是修改我的記錄來電:
logger.debug('<msg>', extra={'funcName': func.__name__})
但是(如文檔已經指出的)這不工作:
KeyError: "Attempt to overwrite 'funcName' in LogRecord"
不過這將是一個非常簡單的並解決問題的解決方案。
那麼,爲什麼logging
阻止我爲內置屬性設置自定義值?
我不確定這是否真的可以回答。該模塊按照文檔中的描述工作。至於*爲什麼*這個模塊就是這樣設計的,你就得問問開發人員。 – augurar