[英]How to silence the logging of a module?
我想將httpimport
用作幾個腳本httpimport
的日志記錄庫。 該模塊生成自己的日志,我不知道該如何靜音。
在這種情況下,我會用
logging.getLogger('httpimport').setLevel(logging.ERROR)
但它沒有用。
以下代碼是上面提到的“通用日志記錄代碼”的存根:
# toconsole.py
import logging
import os
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(message)s')
handler_console = logging.StreamHandler()
level = logging.DEBUG if 'DEV' in os.environ else logging.INFO
handler_console.setLevel(level)
handler_console.setFormatter(formatter)
log.addHandler(handler_console)
# disable httpimport logging except for errors+
logging.getLogger('httpimport').setLevel(logging.ERROR)
一個簡單的用法,例如
import httpimport
httpimport.INSECURE = True
with httpimport.remote_repo(['githublogging'], 'http://localhost:8000/') :
from toconsole import log
log.info('yay!')
提供以下輸出
[!] Using non HTTPS URLs ('http://localhost:8000//') can be a security hazard!
2019-08-25 13:56:48,671 yay!
yay!
第二(光禿) yay!
必須來自httpimport
,即來自其日志記錄設置。
如何禁用此類模塊的日志記錄,或者更好-提高其級別,以便僅記錄error +?
注意:這個問題最初是在GitHub存儲庫的httpimport
部分中針對httpimport
但是作者也不知道如何解決該問題。
發生這種情況的原因是,當您import httpimport
它們將對日志記錄機器進行初始配置。 這就是在這里發生的。 這意味着根記錄器已經連接了StreamHandler
。 因此,所有記錄器都從根記錄器繼承,因此當您執行log.info('yay')
它不僅使用Handler
和Formatter
,還將它們傳播到根記錄器,后者也發出消息。
請記住,除非應用程序另有指定,否則在應用程序啟動時首先調用basicConfig
人basicConfig
根記錄器設置默認配置,該配置將由所有記錄器繼承。
如果您具有復雜的日志記錄配置,則需要確保在執行任何可能調用basicConfig
的第三方導入之前先調用它。 basicConfig
是冪等的,這意味着第一個調用可以達成協議,而后續調用則無效。
log.propagate = False
並且您會看到第二行不會顯示。 Formatter
直接附加到已經存在的根Handler
(無需自己添加其他Handler
) root = logging.getLogger('')
formatter = logging.Formatter('%(asctime)s %(message)s')
root_handler = root.handlers[0]
root_handler.setFormatter(formatter)
您可以在初始化應用程序時進行basicConfig
調用(如果您有這樣的配置,可以使用初始Formatters
和Handlers
等將所有內容優雅地整潔地附加到根記錄器),那么您將只執行logger = logging.getLogger(__name__)
和logger.info('some message')
,它們將按您期望的方式工作,因為它將一直傳播到已經具有您的配置的根記錄器。
您可以通過執行類似的操作來刪除根記錄器中存在的初始Handler
程序
root = logging.getLogger('')
root.handlers = []
...還有更多解決方案,但您明白了。
還要注意, logging.getLogger('httpimport').setLevel(logging.ERROR)
可以很好地工作。 在logging.ERROR
下面沒有消息。該記錄器將不會記錄ERROR,只是問題不在這里。
但是,如果您想完全禁用記錄器,則可以執行logger.disabled = True
(同樣要注意,問題並非來自於httpimport
記錄器,如上所述)
以此更改您的toconsole.py ,您不會看到第二個。
import logging
import os
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
root_logger = logging.getLogger('')
root_handler = root_logger.handlers[0]
formatter = logging.Formatter('%(asctime)s %(message)s')
root_handler.setFormatter(formatter)
# or you could just keep your old code and just add log.propagate = False
# or any of the above solutions and it would work
logging.getLogger('httpimport').setLevel(logging.ERROR)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.