Знаете ли вы какой-либо простой способ найти вызов журнала, который выдает «недостаточно аргументов для строки формата».
На моей рабочей станции я изменил logging/__init__.py
для вывода сообщения, чтобы я мог легко найти строку в источнике.
Но знаете ли вы, что делать в среде тестирования, где вы не можете ни изменить стандартную библиотеку Python, ни запустить pdb легко?
Примечание: Трассировка не имеет смысла, и она осторожна библиотекой журналов.
Вот обратная связь:
File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
if self.shouldRollover(record):
File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
msg = "%s\n" % self.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
return fmt.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 436, in format
record.message = record.getMessage()
File "/usr/lib/python2.6/logging/__init__.py", line 306, in getMessage
msg = msg % self.args
TypeError: not enough arguments for format string
А вот код в стандартной библиотеке, который ловит ошибку
try:
if self.shouldRollover(record):
self.doRollover()
logging.FileHandler.emit(self, record)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
Решение, предложенное Алексом:
Я обернул getMessage для печати сообщения и аргументов. Вот код:
def print_log_record_on_error(func):
def wrap(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except:
import sys
print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
getattr(self, 'msg', '?'), getattr(self, 'args', '?'))
raise
return wrap
import logging
logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage)