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