我有一个自定义的logging.Formatter
,它支持一些额外的属性,但是当我也指定format
属性时,它们不会被初始化。如果我注解掉format
行,.
属性将正确地替换其自定义属性。
"custom_formatter": {
"()": MyFormatter,
"style": "{",
"datefmt": "%Y-%m-%d %H:%M:%S",
"format": "<custom-format>", # <-- when removed, then the '.' works
".": {
"custom_property": "value"
}
}
为什么使用format
时.
不工作?
格式化程序是这样实现的:
class MyFormatter(logging.Formatter):
custom_property: str = "."
def format(self, record: logging.LogRecord) -> str:
# ...
return super().format(record)
1条答案
按热度按时间55ooxyrt1#
我发现了bug。显然,该属性的名称已从
format
更改为fmt
,并且旧示例在其代码中显示format
,当使用此属性时,处理.
字典的代码不会执行,因为初始化福尔斯会返回到异常处理程序,并跳过通常执行.
的其余代码这是错误处理程序:
https://github.com/python/cpython/blob/main/Lib/logging/config.py#L670
这是在
result = c(**kwargs)
行抛出错误的代码,因此跳过了props
的处理,因为config
不再包含.
,因为它在第一次尝试时就从字典中弹出了!https://github.com/python/cpython/blob/main/Lib/logging/config.py#L480
props = config.pop('.', None)
行应该在result = c(**kwargs)
之后。