如何在python日志记录模块中获取当前日志级别

时间:2017-08-28 16:14:12

标签: python python-2.7 logging

我正在尝试创建一个基本的记录器,它将在没有外部包的情况下着色,

# 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": "\033[92m{}\033[0m",
        "WARNING": "\033[93m{}\033[0m",
        "DEBUG": "\033[94m{}\033[0m",
        "ERROR": "\033[91m{}\033[0m",
        "CRITICAL": "\033[91m{}\033[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)

截至目前,我需要做的就是获取将在logging.Formatter中设置的当前日志级别并将其发送到我的小函数:

console_format = logging.Formatter(
    "[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S"
)

是否可以从日志包中获取当前日志级别?

例如,假设我通过了logger.INFO("test")我需要一种方法让INFO成为一个字符串,从那里,set_color_value("INFO")应该返回:

enter image description here

5 个答案:

答案 0 :(得分:4)

是的,您可以通过

检查记录器级别
level = logger.level

答案 1 :(得分:3)

我决定以不同的方式执行此操作,并通过字符串本身添加颜色:

def set_color(org_string, level=None):
    color_levels = {
        10: "\033[36m{}\033[0m",       # DEBUG
        20: "\033[32m{}\033[0m",       # INFO
        30: "\033[33m{}\033[0m",       # WARNING
        40: "\033[31m{}\033[0m",       # ERROR
        50: "\033[7;31;31m{}\033[0m"   # FATAL/CRITICAL/EXCEPTION
    }
    if level is None:
        return color_levels[20].format(org_string)
    else:
        return color_levels[int(level)].format(org_string)

例如:

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

将输出:

enter image description here

答案 2 :(得分:0)

如果您使用root记录器,例如因为您致电logging.basicConfig(),则可以使用

import logging
logging.root.level

例如

if logging.DEBUG >= logging.root.level:
    # Do something

答案 3 :(得分:0)

在记录器实例中,您可以像@MilánVásárhelyi所说的那样进行检查:

myLogger.level

这将返回级别为int的值。如果您希望将名称显示为字符串,则可以执行以下操作:

logging.getLevelName(myLogger.level)

答案 4 :(得分:0)

正如 this walk through the source code 中所解释的,logger.level 经常是错误的。

你想要logger.getEffectiveLevel()

引用来源:

“这是要点:不要依赖 .level。如果您没有在记录器对象上明确设置级别,并且出于某种原因依赖 .level,那么您的日志记录设置将行为可能与您预期的不同。”