如何设置导入模块的日志级别



用一个漂亮的记录器编写你的代码

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')(或任何其他...(创建它的对象

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

最通用的方法是按导入模块的名称检索记录器,如下所示:

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

使用此方法,您还可以通过使用表示法指定子模块来设置子模块的日志级别:

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

这应该适用于第三方软件包,因为它们通常坚持使用命名记录器的约定,并根据模块名称命名:

logger = logging.getLogger(__name__)

另一种选择(尽管如果上述通用方法有效,则不建议使用(是提取模块的记录器变量并根据需要对其进行自定义。大多数第三方模块将其存储在名为 logger_log 的模块级变量中。在您的情况下:

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

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

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

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

最新更新