How to get the current log level in python logging module
Question:
I’m trying to create a basic logger that will be colored without external packages,
# these have to be the first functions so I can use it in the logger settings
def create_log_name(log_path="{}/log", filename="zeus-log-{}.log"):
if not os.path.exists(log_path.format(os.getcwd())):
os.mkdir(log_path.format(os.getcwd()))
find_file_amount = len(os.listdir(log_path.format(os.getcwd())))
full_log_path = "{}/{}".format(log_path.format(os.getcwd()), filename.format(find_file_amount + 1))
return full_log_path
def set_color_value(levelname):
log_set = {
"INFO": " 33[92m{} 33[0m",
"WARNING": " 33[93m{} 33[0m",
"DEBUG": " 33[94m{} 33[0m",
"ERROR": " 33[91m{} 33[0m",
"CRITICAL": " 33[91m{} 33[0m"
}
return log_set[levelname].format(levelname)
logger = logging.getLogger("zeus-log")
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler(
filename=create_log_name(), mode="a+"
)
file_handler.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter(
'%(asctime)s;%(name)s;%(levelname)s;%(message)s'
)
console_format = logging.Formatter(
"[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S"
)
file_handler.setFormatter(file_format)
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
So as of right now, all I need to do is get the current log level that will be set in the logging.Formatter
and send it to my little function:
console_format = logging.Formatter(
"[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S"
)
Is it possible to get the current log level from the logging package?
For example, lets say I pass logger.INFO("test")
I need a way to get that INFO
part in as a string, from there, set_color_value("INFO")
should return:
Answers:
Yes, you can check the logger level by
level = logger.level
I decided to do this a different way and add color through the string itself with a level number:
def set_color(org_string, level=None):
color_levels = {
10: " 33[36m{} 33[0m", # DEBUG
20: " 33[32m{} 33[0m", # INFO
30: " 33[33m{} 33[0m", # WARNING
40: " 33[31m{} 33[0m", # ERROR
50: " 33[7;31;31m{} 33[0m" # FATAL/CRITICAL/EXCEPTION
}
if level is None:
return color_levels[20].format(org_string)
else:
return color_levels[int(level)].format(org_string)
So for example:
logger.info(set_color("test"))
logger.debug(set_color("test", level=10))
logger.warning(set_color("test", level=30))
logger.error(set_color("test", level=40))
logger.fatal(set_color("test", level=50))
Will output:
If you’re using the root logger, for example because you called logging.basicConfig()
then you can use
import logging
logging.root.level
For example
if logging.DEBUG >= logging.root.level:
# Do something
In your logger instance you can check it like this, as @Milán Vásárhelyi said:
myLogger.level
That will return the level as int. if you prefer to show the name, as string, you can do:
logging.getLevelName(myLogger.level)
As explained in this walk through the source code logger.level
is often wrong.
You want logger.getEffectiveLevel()
To quote the source:
Here’s the takeaway: don’t rely on .level
. If you haven’t explicitly set a level on your logger object, and you’re depending on .level
for some reason, then your logging setup will likely behave differently than you expected it to.
I’m trying to create a basic logger that will be colored without external packages,
# these have to be the first functions so I can use it in the logger settings
def create_log_name(log_path="{}/log", filename="zeus-log-{}.log"):
if not os.path.exists(log_path.format(os.getcwd())):
os.mkdir(log_path.format(os.getcwd()))
find_file_amount = len(os.listdir(log_path.format(os.getcwd())))
full_log_path = "{}/{}".format(log_path.format(os.getcwd()), filename.format(find_file_amount + 1))
return full_log_path
def set_color_value(levelname):
log_set = {
"INFO": " 33[92m{} 33[0m",
"WARNING": " 33[93m{} 33[0m",
"DEBUG": " 33[94m{} 33[0m",
"ERROR": " 33[91m{} 33[0m",
"CRITICAL": " 33[91m{} 33[0m"
}
return log_set[levelname].format(levelname)
logger = logging.getLogger("zeus-log")
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler(
filename=create_log_name(), mode="a+"
)
file_handler.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter(
'%(asctime)s;%(name)s;%(levelname)s;%(message)s'
)
console_format = logging.Formatter(
"[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S"
)
file_handler.setFormatter(file_format)
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
So as of right now, all I need to do is get the current log level that will be set in the logging.Formatter
and send it to my little function:
console_format = logging.Formatter(
"[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S"
)
Is it possible to get the current log level from the logging package?
For example, lets say I pass logger.INFO("test")
I need a way to get that INFO
part in as a string, from there, set_color_value("INFO")
should return:
Yes, you can check the logger level by
level = logger.level
I decided to do this a different way and add color through the string itself with a level number:
def set_color(org_string, level=None):
color_levels = {
10: " 33[36m{} 33[0m", # DEBUG
20: " 33[32m{} 33[0m", # INFO
30: " 33[33m{} 33[0m", # WARNING
40: " 33[31m{} 33[0m", # ERROR
50: " 33[7;31;31m{} 33[0m" # FATAL/CRITICAL/EXCEPTION
}
if level is None:
return color_levels[20].format(org_string)
else:
return color_levels[int(level)].format(org_string)
So for example:
logger.info(set_color("test"))
logger.debug(set_color("test", level=10))
logger.warning(set_color("test", level=30))
logger.error(set_color("test", level=40))
logger.fatal(set_color("test", level=50))
Will output:
If you’re using the root logger, for example because you called logging.basicConfig()
then you can use
import logging
logging.root.level
For example
if logging.DEBUG >= logging.root.level:
# Do something
In your logger instance you can check it like this, as @Milán Vásárhelyi said:
myLogger.level
That will return the level as int. if you prefer to show the name, as string, you can do:
logging.getLevelName(myLogger.level)
As explained in this walk through the source code logger.level
is often wrong.
You want logger.getEffectiveLevel()
To quote the source:
Here’s the takeaway: don’t rely on
.level
. If you haven’t explicitly set a level on your logger object, and you’re depending on.level
for some reason, then your logging setup will likely behave differently than you expected it to.