У кого-нибудь есть инструмент для обнаружения операторов python logger с недопустимым количеством аргументов? - PullRequest
1 голос
/ 15 октября 2010

например, если у вас есть код, который делает что-то подобное где-то в вашей кодовой базе:

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger(__name__)
>>> logger.critical("foo: %s", 1, 2)
Traceback (most recent call last):
  File "/pluto/local/lib/python2.6/logging/__init__.py", line 768, in emit
    msg = self.format(record)
  File "/pluto/local/lib/python2.6/logging/__init__.py", line 648, in format
    return fmt.format(record)
  File "/pluto/local/lib/python2.6/logging/__init__.py", line 436, in format
    record.message = record.getMessage()
  File "/pluto/local/lib/python2.6/logging/__init__.py", line 306, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting
>>> 

... вы просто получите эту трассировку стека без указания того, где находится исходный оператор плохого регистратора.*

Кажется, что было бы не сложно написать что-то, что использует модуль Tokenize или модуль Ast или что-то для обработки исходного кода Python и обнаружения этих проблем, но я не могу себе представить, что я первый человек, который хотелчто-то вроде этого.

Обновление: я представлял скорее инструмент статического анализа, а не изменение кода регистрации или изменение процесса (например, просмотр кода).Я не считаю, что обзор кода достаточно хорош, потому что люди никогда не бывают непогрешимыми.В моем конкретном случае у нас уже есть много инструментов, которые запускают код и обнаруживают типичные ошибки (например, вы оставили pdb in, pylint и т. Д.) ... Я действительно надеялся добавить инструмент в этот набор инструментов.

Ответы [ 2 ]

0 голосов
/ 19 октября 2010

Я сделал скрипт, который делает то, что мне нужно.Он пока не обрабатывает много крайних случаев, но он выполнил работу для моей ситуации (поиск иголки (6 плохих строк журнала) в моем стоге сена (82 195 строк кода Python)).

http://github.com/lgastako/loglint

0 голосов
/ 15 октября 2010

Один обходной путь будет:

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger(__name__)
>>> logger.critical("foo: %s" % (1, 2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Или вы хотите использовать этот специальный синтаксис для ведения журнала. А если, я спрашиваю, почему?

Я мог бы подумать только о сохранении шагов оценки, если бы сообщение было отброшено из-за слишком низкого уровня журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...