Cayenne,French Guiana
Georgetown,Guyana
Asunción,Paraguay
Lima,Peru
Paramaribo,Suriname
Montevideo,Uruguay
Caracas,Venezuela
Только что мы кратко рассмотрели отладчик — этого достаточно, чтобы показать
вам, что вы можете сделать и какие команды будете использовать большую часть
времени.
Помните: больше тестов — меньше отладки.
Записываем в журнал
сообщения об ошибках
В какой-то момент вам может понадобиться перейти от использования выраже-
ний print() к записи сообщений в журнал. Журнал, как правило, представляет
собой системный файл, в котором накапливаются сообщения, содержащие по-
лезную информацию вроде временной метки или имени пользователя, запустив-
шего программу. Зачастую журналы ежедневно ротируются (переименовыва-
ются) и сжимаются, благодаря чему они не переполняют ваш диск и не создают
проблем. Если у вашей программы что-то пошло не так, вы можете просмотреть
соответствующий файл журнала, чтобы увидеть, что произошло. Содержимое
исключений особенно полезно записывать в журнал, поскольку оно подсказывает
Записываем в журнал сообщения об ошибках
369
вам номер строки, после выполнения которой программа завершилась, и причину
такого завершения.
Для журналирования используется модуль стандартной библиотеки logging
(http://bit.ly/py-logging). Большинство его описаний я считаю немного непонятными.
Спустя некоторое время эти описания будут казаться осмысленными, но в первый
раз они выглядят чересчур сложными. Модуль logging содержит следующие кон-
цепции:
сообщение, которое вы хотите сохранить в журнал;
уровни приоритета и соответствующие функции — debug(), info(), warn(), error()
и critical();
один или несколько объектов журналирования для основной связи с модулем;
обработчики, которые направляют значение в терминал, файл, базу данных или
куда-нибудь еще;
средства форматирования выходных данных;
фильтры, которые принимают решения в зависимости от входных данных.
Рассмотрим простейший пример журналирования — просто импортируем мо-
дуль и воспользуемся некоторыми из его функций:
>>> import logging
>>> logging.debug("Looks like rain")
>>> logging.info("And hail")
>>> logging.warn("Did I hear thunder?")
WARNING:root:Did I hear thunder?
>>> logging.error("Was that lightning?")
ERROR:root:Was that lightning?
>>> logging.critical("Stop fencing and get inside!")