'How to set the log level for an imported module?

Write your code with a nice logger

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()

works as expected. Logging using logger.debug("Hello! :)") logs to file and console.

In a second step you want to import an external module which is also logging using logging module:

  1. Install it using pip3 install pymisp (or any other external module)
  2. Import it using from pymisp import PyMISP (or any other external module)
  3. Create an object of it using self.pymisp = PyMISP(self.ds_model.api_url, self.ds_model.api_key, False, 'json') (or any other...)

What now happens is, that every debug log output from the imported module is getting logged to the log file and the console. The question now is, how to set a different (higher) log level for the imported module.



Solution 1:[1]

As Meet Sinoja and anishtain4 pointed out in the comments, the best and most generic method is to retrieve the logger by the name of the imported module as follows:

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

Another option (though not recommended if the generic method above works) is to extract the module's logger variable and customize it to your needs. Most third-party modules store it in a module-level variable called logger or _log. In your case:

import logging    
import pymisp

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

Solution 2:[2]

A colleague of mine helped with this question:

  1. Get a named logger yourLogger = logging.getLogger('your_logger')
  2. Add a filter to each handler prevents them to print/save other logs than yours

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 gies0r