簡體   English   中英

如何使模塊的日志靜音?

[英]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')它不僅使用HandlerFormatter ,還將它們傳播到根記錄器,后者也發出消息。

請記住,除非應用程序另有指定,否則在應用程序啟動時首先調用basicConfigbasicConfig根記錄器設置默認配置,該配置將由所有記錄器繼承。

如果您具有復雜的日志記錄配置,則需要確保在執行任何可能調用basicConfig的第三方導入之前先調用它。 basicConfig冪等的,這意味着第一個調用可以達成協議,而后續調用則無效。

解決方案

  1. 您可以執行log.propagate = False並且您會看到第二行不會顯示。
  2. 您可以通過執行以下操作將Formatter直接附加到已經存在的根Handler (無需自己添加其他Handler
root = logging.getLogger('')
formatter = logging.Formatter('%(asctime)s %(message)s')
root_handler = root.handlers[0]
root_handler.setFormatter(formatter)
  1. 您可以在初始化應用程序時進行basicConfig調用(如果您有這樣的配置,可以使用初始FormattersHandlers等將所有內容優雅地整潔地附加到根記錄器),那么您將只執行logger = logging.getLogger(__name__)logger.info('some message') ,它們將按您期望的方式工作,因為它將一直傳播到已經具有您的配置的根記錄器。

  2. 您可以通過執行類似的操作來刪除根記錄器中存在的初始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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM