【问题标题】:logging http requests from aiohttp记录来自 aiohttp 的 http 请求
【发布时间】:2019-04-06 05:11:37
【问题描述】:

我想记录 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 没有指定任何记录器参数。

【问题讨论】:

标签: python logging aiohttp


【解决方案1】:

我只需要导入日志并添加

 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")

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,这行得通。但我不明白他们为什么明确列出“aiohttp.client”记录器。那应该用于记录客户端请求,对吗?应该有办法让这个记录器工作
    • 目前 aiohttp 使用 aiohttp.client 仅用于报告有关客户端 API 使用的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多