.. _grab_debugging:

Отладка запросов
================

Использование logging-системы
-----------------------------

Самый простой способ увидеть информацию об отсылаемых запросах - это включить вывод
logging-сообщений с уровнем DEBUG::

    import logging
    logging.basicConfig(level=logging.DEBUG)

Конечно это будет выводить все logging-сообщения, не только те, что сгенерировала библиотека
Grab. Если вам нужны только её сообщения, то настройте вывод сообщенний только от логгера "grab"::

    import logging
    logger = logging.getLogger('grab')
    logger.addHandler(logging.StreamHandler())
    logger.setLevel(logging.DEBUG)

Также вы можете воспользоваться функцией `default_logging` которая настраивает logging-систему на вывод
всех сообщений Grab в файл::

    from grab.tools.logs import default_logging
    default_logging()

После вызова этой функции вы можете через отдельную консоль наблюдать за активностью Grab с помощью
команды `tail -f /tmp/grab.log`.

На каждый сетевой запрос Grab генерирует logging-сообщение следующего вида::

    [5864] GET http://www.kino-govno.com/movies/rusichi via 188.120.244.68:8080 proxy of type http with authorization

В начале мы видим номер запроса, далее типа запроса, затем адрес документа и в конце указана информация об используемом прокси сервере (если он используется). Если запрос был сделан не из главного thread-потока, то будет казано также имя thread-потока.

Можно включить вывод дополнительных данных о POST-запросах с помощью опции :ref:`option_debug_post`. Тогда на каждый
POST-запрос будет выводиться его содержимое::

    [01] POST http://yandex.ru
    POST request:
    foo                      : bar
    name                     : Ivan


Нумерация запросов
------------------

Каждый сетевой запрос осуществлённый с помощью Grab имеет свой номер. Информация о запросе хранится на уровне модуля, так что запросы различных Grab-объектов имеют тем не менее общий счётчик. Общая нумерация сохраняется даже в случае использования тредов. Номер запроса очень удобно использовать вкупе с опцией :ref:`option_log_dir`, которая сохраняет содержимое сетевых ответов в файлы. Читайте об этом в следующем разделе.


Сохранение запросов и ответов в файлы
-------------------------------------

Обратите внимание на номер запроса, это важная составляющая системы отладки. Если мы включим сохранение содержимого запросов и ответов в файлы, по номеру запроса мы сможем найти нужный файл.

Сперва рассмотрим самую простую опцию :ref:`option_log_file`::

    g.setup(log_file='/tmp/log.html')

Она включает сохранение содержимого последнего ответа в файл. Каждый новый ответ будет перезатирать содержимое старого ответа. Если вам нужно проанализировать содержимое нескольких запросов, то вам понадобится опция :ref:`option_log_dir`::

    g.setup(log_dir='/tmp/some_dir')

После включения опции `log_dir` Grab начинает сохранять в указанную директорию содержимое запросов и ответов. Выше я писал о номере запроса, так вот имя файла будет содержать этот номер. Например, для запроса с номером 28 будут созданы два файла: 01.log и 02.html В log файле будут сохранены HTTP-заголовки как запроса, так и соответствующего ответа. В html файле будет сохранено содержимое ответа (без заголовков).

Счётчик запросов работает на уровне модуля. Это значит, что если вы создадите несколько Grab-объектов, то у них будет общий счётчик запросов и номера запросов не будут пересекаться. Это помогает отлаживать мультитредовые программы или программы, где создаётся несколько Grab объектов в разное время.
