1. ホーム
  2. python

[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。

2022-07-15 09:24:21

質問

pythonを使っています。 リクエスト . をデバッグする必要があります。 OAuth アクティビティのデバッグをする必要があり、そのために実行されたすべてのリクエストを記録することが望まれます。私はこの情報を ngrep でこの情報を得ることができますが、残念ながらhttps接続をgrepすることはできません(これは OAuth )

どのようにしたら、以下のようなURL(+パラメータ)のロギングを有効にできますか? Requests がアクセスするすべての URL (+ パラメータ) のロギングを有効にするにはどうしたらよいでしょうか?

どのように解決するのですか?

基礎となる urllib3 ライブラリはすべての新しい接続と URL を logging モジュール でなく POST のボディは含まない。については GET リクエストではこれで十分でしょう。

import logging

logging.basicConfig(level=logging.DEBUG)

これは最も詳細なロギングオプションを与えるものです。 ロギング HOWTO を参照してください。

短いデモです。

>>> import requests
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> r = requests.get('http://httpbin.org/get?foo=bar&baz=python')
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org:80
DEBUG:urllib3.connectionpool:http://httpbin.org:80 "GET /get?foo=bar&baz=python HTTP/1.1" 200 366

urllib3 の正確なバージョンによって、以下のメッセージが記録されます。

  • INFO : リダイレクト
  • WARN : 接続プールが一杯です(頻繁に発生する場合は、接続プールのサイズを大きくしてください)。
  • WARN : ヘッダの解析に失敗しました(無効な形式のレスポンスヘッダ)。
  • WARN : 接続を再試行する
  • WARN : 証明書は期待されたホスト名と一致しませんでした
  • WARN : チャンクされた応答を処理する際に、Content-Length と Transfer-Encoding の両方を含む応答を受信しました。
  • DEBUG : 新規接続 (HTTP または HTTPS)
  • DEBUG : 接続を切断しました
  • DEBUG : 接続の詳細: メソッド、パス、HTTP バージョン、ステータスコード、レスポンスの長さ
  • DEBUG : リトライ回数インクリメント

ヘッダーやボディは含まれません。 urllib3http.client.HTTPConnection クラスを使いますが、このクラスはロギングをサポートしません。 印刷 を標準出力に出力するようにしか設定できません。しかし、ロギングにすべてのデバッグ情報を送るように設定することができます。 print という名前をそのモジュールに導入することで、すべてのデバッグ情報をロギングに送るようにすることができます。

import logging
import http.client

httpclient_logger = logging.getLogger("http.client")

def httpclient_logging_patch(level=logging.DEBUG):
    """Enable HTTPConnection debug logging to the logging framework"""

    def httpclient_log(*args):
        httpclient_logger.log(level, " ".join(args))

    # mask the print() built-in in the http.client module to use
    # logging instead
    http.client.print = httpclient_log
    # enable debugging
    http.client.HTTPConnection.debuglevel = 1

呼び出し httpclient_logging_patch() 原因 http.client 接続はすべてのデバッグ情報を標準ロガーに出力し、そのため logging.basicConfig() :

>>> httpclient_logging_patch()
>>> r = requests.get('http://httpbin.org/get?foo=bar&baz=python')
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org:80
DEBUG:http.client:send: b'GET /get?foo=bar&baz=python HTTP/1.1\r\nHost: httpbin.org\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n'
DEBUG:http.client:reply: 'HTTP/1.1 200 OK\r\n'
DEBUG:http.client:header: Date: Tue, 04 Feb 2020 13:36:53 GMT
DEBUG:http.client:header: Content-Type: application/json
DEBUG:http.client:header: Content-Length: 366
DEBUG:http.client:header: Connection: keep-alive
DEBUG:http.client:header: Server: gunicorn/19.9.0
DEBUG:http.client:header: Access-Control-Allow-Origin: *
DEBUG:http.client:header: Access-Control-Allow-Credentials: true
DEBUG:urllib3.connectionpool:http://httpbin.org:80 "GET /get?foo=bar&baz=python HTTP/1.1" 200 366