Using a variable while calling logger.setLevel
Question:
Does anyone know if there is a way to use a variable in the setlevel() function of Python’s Logging module?
At the moment I am using this:
Log = logging.getLogger('myLogger')
Log.setLevel(logging.DEBUG)
But I’d like to have this:
Log = logging.getLogger('myLogger')
levels = {'CRITICAL' : logging.critical,
'ERROR' : logging.error,
'WARNING' : logging.warning,
'INFO' : logging.info,
'DEBUG' : logging.debug
}
level = levels['INFO']
Log.setLevel(level)
But it doesn’t seem to work – it just doesn’t log anything.
I’m doing this so that I can set the logging level for a whole bunch of scripts from a variable in a single config file.
Answers:
You should also be able to do this:
Log = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
Log.setLevel(level)
The logging.getLevelName(lvl)
function works both ways. I use it, it works (you should check your python implementation though).
This saves you the trouble to maintain your own dictionary, and reduces the possibility of typo errors.
I had problems with python 3 and got this working for me:
https://docs.python.org/3/howto/logging.html
# myapp.py
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
What about using getattr
on logging
module?
import logging
str_level = 'DEBUG'
level = getattr(logging, str_level)
logger = logging.getLogger("my_logger")
logger.setLevel(level)
print(logger.getEffectiveLevel())
logging.setLevel()
takes an int or a str.
So the following works just fine (at least in Python 3.7):
logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
I find that leveraging an optional environmental variable is very convenient and flexible:
class Foo():
def __init__(self):
self.logger = logging.getLogger(__name__)
level = logging.getLevelName(os.environ.get('LOG_LEVEL', 'ERROR'))
logging.basicConfig(level=level)
def bar(self):
self.logger.debug('Log something')
I was able to get this working below. I added a environment variable section as I am using this in a Docker but you can add it in as you see fit. This way you can select what you need and re-run your script.
#Manual Testing Variables If Needed
#os.environ["LOG_LEVEL_SELECTOR"] = "DEBUG, INFO, or ERROR"
#Setting Log Level Test
logger = logging.getLogger('json')
logger.addHandler(json_handler_out)
logger_levels = {
'ERROR' : logging.ERROR,
'INFO' : logging.INFO,
'DEBUG' : logging.DEBUG
}
logger_level_selector = os.environ["LOG_LEVEL_SELECTOR"]
logger.setLevel(logger_level_selector)
Does anyone know if there is a way to use a variable in the setlevel() function of Python’s Logging module?
At the moment I am using this:
Log = logging.getLogger('myLogger')
Log.setLevel(logging.DEBUG)
But I’d like to have this:
Log = logging.getLogger('myLogger')
levels = {'CRITICAL' : logging.critical,
'ERROR' : logging.error,
'WARNING' : logging.warning,
'INFO' : logging.info,
'DEBUG' : logging.debug
}
level = levels['INFO']
Log.setLevel(level)
But it doesn’t seem to work – it just doesn’t log anything.
I’m doing this so that I can set the logging level for a whole bunch of scripts from a variable in a single config file.
You should also be able to do this:
Log = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
Log.setLevel(level)
The logging.getLevelName(lvl)
function works both ways. I use it, it works (you should check your python implementation though).
This saves you the trouble to maintain your own dictionary, and reduces the possibility of typo errors.
I had problems with python 3 and got this working for me:
https://docs.python.org/3/howto/logging.html
# myapp.py
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
What about using getattr
on logging
module?
import logging
str_level = 'DEBUG'
level = getattr(logging, str_level)
logger = logging.getLogger("my_logger")
logger.setLevel(level)
print(logger.getEffectiveLevel())
logging.setLevel()
takes an int or a str.
So the following works just fine (at least in Python 3.7):
logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
I find that leveraging an optional environmental variable is very convenient and flexible:
class Foo():
def __init__(self):
self.logger = logging.getLogger(__name__)
level = logging.getLevelName(os.environ.get('LOG_LEVEL', 'ERROR'))
logging.basicConfig(level=level)
def bar(self):
self.logger.debug('Log something')
I was able to get this working below. I added a environment variable section as I am using this in a Docker but you can add it in as you see fit. This way you can select what you need and re-run your script.
#Manual Testing Variables If Needed
#os.environ["LOG_LEVEL_SELECTOR"] = "DEBUG, INFO, or ERROR"
#Setting Log Level Test
logger = logging.getLogger('json')
logger.addHandler(json_handler_out)
logger_levels = {
'ERROR' : logging.ERROR,
'INFO' : logging.INFO,
'DEBUG' : logging.DEBUG
}
logger_level_selector = os.environ["LOG_LEVEL_SELECTOR"]
logger.setLevel(logger_level_selector)