Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 317
gies0r Avatar asked Nov 13 '17 13:11

gies0r


People also ask

How do I choose a log level?

When choosing a log level, it's important to know how visible you want the message to be, how big of a problem it is, and what you want the user to do about it. With that in mind, this is the decision tree I follow when choosing a log level: Can you continue execution after this? If no, use the error log level.

What is the default level in logging module?

By default, the root log level is WARN, so every log with lower level (for example via logging.info("info") ) will be ignored. Another particularity of the root logger is that its default handler will be created the first time a log with a level greater than WARN is logged.

What is logging level in Python?

Logging Levels When you set a logging level in Python using the standard module, you're telling the library you want to handle all events from that level up. Setting the log level to INFO will include INFO, WARNING, ERROR, and CRITICAL messages. NOTSET and DEBUG messages will not be included here.

What log level should I use in production?

The usual advice. Logging levels are usually considered to be in order of importance: turn on "unimportant" levels in development ( trace , debug and the like), but enable only the "most important" levels ( warning , error , etc.) in production, where resources like CPU time and disk space are precious.


1 Answers

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) 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
like image 178
F.M.F. Avatar answered Oct 13 '22 18:10

F.M.F.