Reputation: 5239
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:
pip3 install pymisp
(or any other external module)from pymisp import PyMISP
(or any other external module)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.
Upvotes: 28
Views: 16444
Reputation: 2320
The 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)
With this approach you can also set the log level of submodules by specifying them using dot notation:
logging.getLogger("some_module_with_logging.submodule").setLevel(logging.WARNING)
This should work for third-party-packages as they normally stick to the convention of using a named logger with a name according to the module name:
logger = logging.getLogger(__name__)
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
Upvotes: 29
Reputation: 5239
A colleague of mine helped with this question:
yourLogger = logging.getLogger('your_logger')
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'))
Upvotes: -1