【问题标题】:How to set the log level for an imported module?如何设置导入模块的日志级别?
【发布时间】:2018-04-26 05:28:08
【问题描述】:

用一个不错的记录器编写代码

import logging

def init_logging():
     logFormatter = logging.Formatter("[%(asctime)s] %(levelname)s::%(module)s::%(funcName)s() %(message)s")
     rootLogger = logging.getLogger()
     LOG_DIR = os.getcwd() + '/' + 'logs'
     if not os.path.exists(LOG_DIR):
          os.makedirs(LOG_DIR)
     fileHandler = logging.FileHandler("{0}/{1}.log".format(LOG_DIR, "g2"))
     fileHandler.setFormatter(logFormatter)
     rootLogger.addHandler(fileHandler)
     rootLogger.setLevel(logging.DEBUG)
     consoleHandler = logging.StreamHandler()
     consoleHandler.setFormatter(logFormatter)
     rootLogger.addHandler(consoleHandler)
     return rootLogger

logger = init_logging()

按预期工作。使用logger.debug("Hello! :)") 记录到文件和控制台。

在第二步中,您要导入一个外部模块,该模块也使用日志模块进行日志记录

  1. 使用pip3 install pymisp(或任何其他外部模块)安装它
  2. 使用from pymisp import PyMISP(或任何其他外部模块)导入它
  3. 使用self.pymisp = PyMISP(self.ds_model.api_url, self.ds_model.api_key, False, 'json')(或任何其他...)创建它的对象

现在发生的情况是,导入模块的每个调试日志输出都被记录到日志文件和控制台。 现在的问题是,如何为导入的模块设置不同的(更高的)日志级别。

【问题讨论】:

  • 如果google把你带到这里,最好使用logging.getLogger('modulename').setLevel(logging.DEBUG)而不是直接从模块中操作日志对象。

标签: python python-3.x logging python-import


【解决方案1】:

正如 Meet Sinojaanishtain4 在 cmets 中指出的,最好和最通用的方法是通过导入模块的名称来检索记录器,如下所示:

import logging
import some_module_with_logging
logging.getLogger("some_module_with_logging").setLevel(logging.WARNING)

另一个选项(虽然不推荐)是提取模块的记录器变量并根据您的需要对其进行自定义。大多数第三方模块将其存储在名为logger_log 的模块级变量中。在你的情况下:

import logging    
import pymisp

pymisp.logger.setLevel(logging.INFO)
# code of module goes here

【讨论】:

  • 感谢您的回答。在这种情况下{AttributeError}'PyMISP' object has no attribute 'logger'
  • 因为你的导入。使用import pymisp 代替(或附加到)from pymisp import PyMISP
  • 编辑以匹配一般情况。
  • 一些模块使用_log而不是记录器(例如matplotlib)。
  • 如果库不存在logger_log,另一种方法是:logging.getLogger("imported_module_name").setLevel(logging.WARNING)
【解决方案2】:

我的一位同事帮助解决了这个问题:

  1. 获取命名记录器yourLogger = logging.getLogger('your_logger')
  2. 为每个处理程序添加一个过滤器,以防止它们打印/保存除您之外的其他日志

    for handler in logging.root.handlers:
        handler.addFilter(logging.Filter('your_logger'))
    

【讨论】:

  • 使用这种方法,您不会设置更高的日志级别,而是完全抑制模块的日志。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多