【发布时间】:2021-11-10 14:30:17
【问题描述】:
我尝试使用自定义格式化程序创建自定义记录器,并相应地从 logging.Logger 和 logging.Formatter 继承它们。但是,即使我将style 指定为"{",我也会收到错误消息。据我了解,此错误是由格式化程序尝试使用旧式% 格式化造成的。
这是我的logger.py、formatter.py 和main.py 的示例,以重现此内容。
# logger.py
import logging
from formatter import CustomFormatter
class CustomLogger(logging.Logger):
def __init__(self, name: 'str'):
super().__init__(name)
self._console_handler = logging.StreamHandler()
format_string_for_console = '[{levelname}] {name}: {message}'
time_format_string = '%Y-%m-%d %H:%M:%S%Z'
console_formatter = CustomFormatter(
fmt=format_string_for_console,
datefmt=time_format_string,
style='{')
self._console_handler.setFormatter(console_formatter)
# formatter.py
import copy
import logging
class CustomFormatter(logging.Formatter):
def __init__(self, fmt: 'str' = None, datefmt: 'str' = None, style: 'str' = '%'):
self.__format = f'Some modification to default format {fmt}'
self.__date_format = datefmt
self.__style = style
super().__init__(fmt, datefmt, style)
def format(self, record: 'logging.LogRecord') -> str:
record_copy = copy.copy(record)
return logging.Formatter(
fmt=self.__format,
datefmt=self.__date_format,
style=self.__style
).format(record_copy)
# main.py
from logger import CustomLogger as CL
logger = CL('test_logger')
logger.warning('info_msg {}', 1)
不要告诉我这个 MVP 的荒谬之处,它被极度缩小到尽可能少,但仍然会重现错误。我得到的错误有这个堆栈跟踪:
--- Logging error ---
Traceback (most recent call last):
File "/usr/lib/python3.8/logging/__init__.py", line 1085, in emit
msg = self.format(record)
File "/usr/lib/python3.8/logging/__init__.py", line 929, in format
return fmt.format(record)
File "/usr/lib/python3.8/logging/__init__.py", line 668, in format
record.message = record.getMessage()
File "/usr/lib/python3.8/logging/__init__.py", line 373, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "<stdin>", line 1, in <module>
Message: 'info_msg {}'
Arguments: (1,)
我一定做错了什么,但我不知道是什么。任何帮助将不胜感激。
【问题讨论】:
-
是错字吗?不应该是 f-string:
format_string_for_console = f'[{levelname}] {name}: {message}'吗? -
@MauriceMeyer,绝对不是。一切都按照文档完成。使用
{意味着该字符串必须使用.format()方法格式化。您可能知道,此方法支持 kwargs。levelname、name和message在__init__中是未知的,但它们稍后将由logging库自动插入,届时它将使用.format()方法格式化字符串。这里的问题是,尽管format_string_for_console的格式正确(使用.format),但传递给logger.warning的参数却不是(他们尝试使用%样式的格式)
标签: python python-3.x logging formatting