仅在代码的某些部分记录打印两次

Logging printing twice only in some parts of the code

我一直在使用自定义格式化程序在我的代码中登录到终端。最近我一直在更改代码中的内容,我找不到为什么现在在代码的某些部分日志被打印了两次。 这是自定义格式化程序的代码:

import logging

class MyFormatter(logging.Formatter):

    debug_format = "[%(levelname)s] (%(module)s::%(funcName)s::%(lineno)d) %(message)s"
    normal_format = "[%(levelname)s] %(message)s"

    blue = "\x1b[36;21m"
    grey = "\x1b[38;21m"
    yellow = "\x1b[33;21m"
    red = "\x1b[31;21m"
    bold_red = "\x1b[31;1m"
    reset = "\x1b[0m"

    def __init__(self):
        super().__init__(fmt="%(levelno)d: %(msg)s", datefmt=None, style="%")

    def format(self, record):

        # Save the original format configured by the user
        # when the logger formatter was instantiated
        format_orig = self._style._fmt

        # Replace the original format with one customized by logging level
        if record.levelno == logging.DEBUG:
            self._style._fmt = MyFormatter.debug_format
            format = MyFormatter.debug_format
        else:
            self._style._fmt = MyFormatter.normal_format
            format = MyFormatter.normal_format

        self.FORMATS = {
            logging.DEBUG: MyFormatter.grey + format + MyFormatter.reset,
            logging.INFO: MyFormatter.blue + format + MyFormatter.reset,
            logging.WARNING: MyFormatter.yellow + format + MyFormatter.reset,
            logging.ERROR: MyFormatter.red + format + MyFormatter.reset,
            logging.CRITICAL: MyFormatter.bold_red + format + MyFormatter.reset,
        }

        log_fmt = self.FORMATS.get(record.levelno)

        # Restore the original format configured by the user
        self._style._fmt = format_orig

        formatter = logging.Formatter(log_fmt)
        return formatter.format(record)

这是我创建记录器的方式:

from src.logs import set_logger, logging

logger = set_logger(__name__, logging.DEBUG)

这是set_logger函数代码:

import logging
from .custom_formatter import MyFormatter

def set_logger(module_name: str, level=logging.DEBUG) -> logging.Logger:
    logger = logging.getLogger(module_name)
    logger.setLevel(level)

    stream_handler = logging.StreamHandler()
    formatter = MyFormatter()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    return logger

现在,当我从 main 调用此记录器时,例如或在导入的模块顶部调用此记录器时,没有问题,并且它只记录一次。但是,当从同一模块中的函数内部调用记录器时,它会被打印两次。 我通过调试注意到正在做的事情是在 MyFormatter class 中的格式化方法结束,然后它再次 returns 到这个格式化方法,我不知道这里发生了什么。您对可能发生的事情有什么想法吗?

PD:另外,如果我在记录器打印两次时也调用打印,我只会打印一次,所以代码肯定只运行一次。

感谢您的宝贵时间!

安德烈斯

set_logger() 中,它调用 addHandler() 但记录器(或祖先记录器)已经有一个处理程序,您不会删除它,因此您将有多个处理程序。

查看 Logger.propagate 的文档:https://docs.python.org/3/library/logging.html#logging.Logger.propagate