记录来自aiohttp的http请求

时间:2018-11-14 10:48:55

标签: python logging aiohttp

我想记录aiohttp ClientSession发送的所有HTTP请求。该文档提供了可用的loggers列表。所以我尝试了以下方法:

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

我尝试了该文档中该列表中的所有记录器,然后搜索了问题。这是相似的: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))

客户也有此必要吗? 我可以合理注入记录器的唯一方法可能是会话。但是ClientSession的API reference没有指定任何记录程序参数。

2 个答案:

答案 0 :(得分:1)

客户端请求-响应生命周期非常复杂,这就是aiohttp不记录它的原因。

请使用client tracing注册所有步骤的回调。之后,您可以通过任何方便的方法(打印,日志记录等)记录所有事件。

答案 1 :(得分:0)

对我来说,所有必要的操作就是导入日志记录并添加

 logging.basicConfig(level=logging.DEBUG)

在我的make_app()中。

默认的access.log格式非常冗长,因此我使用web.run_app的access_log_format参数使它平静了一些。

web.run_app(app, access_log_format=" :: %r %s %T %t")