регистрация http-запросов от aiohttp

Я хочу регистрировать все HTTP-запросы, отправленные http://docs.aiohttp.org/en/stable/index.html ClientSession. Документация содержит список доступных регистраторов. Итак, я попробовал следующее:

import asyncio
import logging

import aiohttp

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
http_logger = logging.getLogger("aiohttp.client")
http_logger.setLevel(logging.DEBUG)
http_logger.propagate = True


async def make_request():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://httpbin.org/get') as resp:
            return await resp.text()


loop = asyncio.get_event_loop()
response_text = loop.run_until_complete(make_request())

print(response_text)

Но это произвело только следующий вывод:

DEBUG:asyncio:Using selector: EpollSelector
// response text print here

Я попробовал все регистраторы из этого списка в документации, а затем искал вопросы. Этот аналогичный: https://stackoverflow.com/questions/43500983/specify-log-request-format-in-aiohttp-2

Ответ описывает, как настроить ведение журнала для сервера aiohttp. Интересно, что они должны явно регистрировать логгер:

app = web.Application(loop=loop)
app.router.add_get('/', handle)
app.router.add_get('/{name}', handle)

loop.run_until_complete(
    loop.create_server(
        app.make_handler(access_log=mylogger,   #<--------------- HERE
                         access_log_format='%r %s %b'), '0.0.0.0', 8080))

Клиенту это тоже нужно? Единственный способ, которым я мог бы разумно внедрить свой регистратор, вероятно, был бы сеансом. Но справочник по API для ClientSession не указывает никакого аргумента регистратора.


person lhk    schedule 14.11.2018    source источник
comment
MB лучшее решение - вручную регистрировать все необходимые данные. Это можно сделать с помощью функций ClientTracing (https://docs.aiohttp.org/en/stable/client_advanced.html#client-tracing)   -  person Yurii Kramarenko    schedule 14.11.2018


Ответы (2)


Жизненный цикл запроса-ответа клиента довольно сложен, поэтому aiohttp не регистрирует его.

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

person Andrew Svetlov    schedule 14.11.2018
comment
да, это работает. Но я не понимаю, почему они явно указывают регистратор aiohttp.client. Это должно быть для регистрации запросов на стороне клиента, верно? Должен быть способ заставить этот регистратор работать - person lhk; 15.11.2018
comment
Сейчас aiohttp использует aiohttp.client только для сообщений о предупреждениях об использовании клиентского API. - person Andrew Svetlov; 15.11.2018

Все, что мне было нужно, это импортировать логирование и добавить

 logging.basicConfig(level=logging.DEBUG)

в моем make_app().

Формат access.log по умолчанию довольно многословен, поэтому я немного успокоил его с помощью аргумента access_log_format для web.run_app.

web.run_app(app, access_log_format=" :: %r %s %T %t")
person Samantha Atkins    schedule 05.04.2019