1. 程式人生 > 程式設計 >Python如何給函式庫增加日誌功能

Python如何給函式庫增加日誌功能

問題

你想給某個函式庫增加日誌功能,但是又不能影響到那些不使用日誌功能的程式。

解決方案

對於想要執行日誌操作的函式庫而已,你應該建立一個專屬的 logger 物件,並且像下面這樣初始化配置:

# somelib.py

import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())

# Example function (for testing)
def func():
  log.critical('A Critical Error!')
  log.debug('A debug message')

使用這個配置,預設情況下不會列印日誌。例如:

>>> import somelib
>>> somelib.func()
>>>

不過,如果配置過日誌系統,那麼日誌訊息列印就開始生效,例如:

>>> import logging
>>> logging.basicConfig()
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>>

討論

通常來講,你不應該在函式庫程式碼中自己配置日誌系統,或者是已經假定有個已經存在的日誌配置了。

呼叫 getLogger(__name__) 建立一個和呼叫模組同名的logger模組。 由於模組都是唯一的,因此建立的logger也將是唯一的。

log.addHandler(logging.NullHandler()) 操作將一個空處理器繫結到剛剛已經建立好的logger物件上。 一個空處理器預設會忽略呼叫所有的日誌訊息。 因此,如果使用該函式庫的時候還沒有配置日誌,那麼將不會有訊息或警告出現。

還有一點就是對於各個函式庫的日誌配置可以是相互獨立的,不影響其他庫的日誌配置。 例如,對於如下的程式碼:

>>> import logging
>>> logging.basicConfig(level=logging.ERROR)

>>> import somelib
>>> somelib.func()
CRITICAL:somelib:A Critical Error!

>>> # Change the logging level for 'somelib' only
>>> logging.getLogger('somelib').level=logging.DEBUG
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
DEBUG:somelib:A debug message
>>>

在這裡,根日誌被配置成僅僅輸出ERROR或更高級別的訊息。 不過 ,somelib 的日誌級別被單獨配置成可以輸出debug級別的訊息,它的優先順序比全域性配置高。 像這樣更改單獨模組的日誌配置對於除錯來講是很方便的, 因為你無需去更改任何的全域性日誌配置——只需要修改你想要更多輸出的模組的日誌等級。

Logging HOWTO 詳細介紹瞭如何配置日誌模組和其他有用技巧,可以參閱下。

以上就是Python如何給函式庫增加日誌功能的詳細內容,更多關於Python給函式庫增加日誌功能的資料請關注我們其它相關文章!