【问题标题】:How can I see in debug logs which IP address is used for connection by Python's request?如何在调试日志中查看 Python 请求使用哪个 IP 地址进行连接?
【发布时间】:2020-04-29 08:02:37
【问题描述】:

假设我正在向一个 URL 发送一个 GET 请求,该 URL 的 DNS 记录包含多个 IP 地址(DNS 循环)。例如,到https://www.twitter.com。如果我们这样做dig,我们会看到:

;; ANSWER SECTION:
twitter.com.        60  IN  A   104.244.42.193
twitter.com.        60  IN  A   104.244.42.129

我已尝试使用此处所述的 DEBUG 日志记录:https://stackoverflow.com/a/16630836/1479414 但是它没有显示它使用的 IP 地址。

此外,我还查看了这个答案:https://stackoverflow.com/a/22513161/1479414 关于如何查看目标 IP 地址,但这不是我真正想要看到的——这个显示了最终使用的 IP 地址。

我想查看在所有尝试期间尝试了哪些 IP 地址,同时库执行 DNS 故障转移。比如:

Trying to connect to 104.244.42.193... failed, trying to connect using another IP address

有可能以某种方式看到吗?

【问题讨论】:

标签: python python-3.x dns python-requests python-logging


【解决方案1】:

urllib3 库在 urllib3.util.connection.create_connection() function 中对此负责。那里有一个循环检查来自socket.getaddrinfo() 的每个结果:

for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
    #  ....
    try:
        sock = socket.socket(af, socktype, proto)
        # ...
        sock.connect(sa)
        return sock

    except socket.error as e:
        # ...

很遗憾,本节中没有使用日志记录。如果你必须有日志,你必须复制函数源,添加你需要的日志,然后猴子补丁urllib3代码来使用你的版本。

使用该函数的唯一位置使用它as an attribute on the imported module,因此至少猴子补丁就像将其分配回原始函数位置一样简单:

import urllib3.util.connection

def create_connection_with_logging(
    address,
    timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
    source_address=None,
    socket_options=None,
):
    # ....

urllib3.util.connection.create_connection = create_connection_with_logging

【讨论】:

  • 您怎么看,为图书馆提出这样的 PR 是否有价值?
  • @Andremoniy:也许,您可以先提交一个 FR 问题并建议您为此创建一个 PR。然后,维护人员可以就此向您提供反馈。
猜你喜欢
  • 2015-04-16
  • 2015-12-29
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2023-03-16
  • 2016-01-24
相关资源
最近更新 更多