如何在调试日志中查看 Python 请求用于连接的 IP 地址?



假设我正在向DNS记录包含多个IP地址的URL发送GET请求(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

我尝试使用调试日志记录,如下所述: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

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

urllib3库在urllib3.util.connection.create_connection()函数中对此负责。那里有一个循环,可以检查来自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代码以改用你的版本。

使用该函数的唯一位置将其用作导入模块上的属性,因此至少猴子修补就像将其分配回原始函数位置一样简单:

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

最新更新