デフォルトでは、 Requests pythonライブラリは以下の行に沿ってログメッセージをコンソールに書き込みます。
Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606
私は通常これらのメッセージには興味がないので無効にしたいと思います。これらのメッセージを黙らせるか、リクエストの冗長性を減らすための最善の方法は何でしょうか。
リクエストのロギングレベルを設定する方法を見つけました。これは標準の logging モジュールを通して行われます。少なくとも警告でない限り、メッセージを記録しないように設定することにしました。
import logging
logging.getLogger("requests").setLevel(logging.WARNING)
Urllib3ライブラリ(通常はリクエストで使用される)にもこの設定を適用したい場合は、以下を追加してください。
logging.getLogger("urllib3").setLevel(logging.WARNING)
あなたがここに来たのなら、(おそらくネストが深い)モジュールのロギングを変更する方法を探しているなら、logging.Logger.manager.loggerDict
を使ってすべてのロガーオブジェクトの辞書を取得してください。返された名前はlogging.getLogger
への引数として使用できます。
import requests
import logging
for key in logging.Logger.manager.loggerDict:
print(key)
# requests.packages.urllib3.connectionpool
# requests.packages.urllib3.util
# requests.packages
# requests.packages.urllib3
# requests.packages.urllib3.util.retry
# PYREADLINE
# requests
# requests.packages.urllib3.poolmanager
logging.getLogger('requests').setLevel(logging.CRITICAL)
# Could also use the dictionary directly:
# logging.Logger.manager.loggerDict['requests'].setLevel(logging.CRITICAL)
コメント内のuser136036によると、この方法では上記のスニペットを実行したときに存在していたロガーだけが表示されます。たとえば、クラスをインスタンス化するときにモジュールが新しいロガーを作成する場合は、その名前を表示するためにクラスを作成するためのスニペットafterを配置する必要があります。
import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
このように、urllib3からのlevel = INFOのすべてのメッセージはログファイルに存在しません。
ですから、ログメッセージにはlevel = INFOを使い続けることができます…あなたが使っているライブラリのためにこれを修正するだけです。
私があなたと同じような問題を抱えた後、私が約1週間か2週間前に書いたそれをコピーしてください。
import requests
import logging
# these two lines enable debugging at httplib level (requests->urllib3->httplib)
# you will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# the only thing missing will be the response.body which is not logged.
import httplib
httplib.HTTPConnection.debuglevel = 1
logging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
requests.get('http://httpbin.org/headers')
logging.config.dictConfig
を使用している人は誰でも、このように辞書のリクエストライブラリログレベルを変更することができます。
'loggers': {
'': {
'handlers': ['file'],
'level': level,
'propagate': False
},
'requests.packages.urllib3': {
'handlers': ['file'],
'level': logging.WARNING
}
}
設定ファイルがある場合は設定できます。
ロガーセクションにurllib3を追加します。
[loggers]
keys = root, urllib3
Logger_urllib3セクションを追加します。
[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool
どのロガーがログメッセージを生成しているかを見つけることについてのKbroseのガイダンスは非常に役に立ちました。私のDjangoプロジェクトでは、私が問題を引き起こしているのがelasticsearch
Pythonライブラリであることが判明するまで、120種類のロガーをソートする必要がありました。ほとんどの質問の手引きに従って、私はこれを私のロガーに加えることによってそれを無効にしました:
...
'elasticsearch': {
'handlers': ['console'],
'level': logging.WARNING,
},
...
他の誰かがElasticsearchクエリを実行するたびに役に立たないログメッセージが届くのを見ている場合に備えて、ここに投稿してください。
ロガー名をrequests
またはrequests.urllib3
に設定してもうまくいきませんでした。ロギングレベルを変更するには、正確なロガー名を指定しなければなりませんでした。
最初にどのロガーを定義したかを見て、どのロガーを削除したいかを見てください。
print(logging.Logger.manager.loggerDict)
そして、あなたはこのようなものを見るでしょう:
{...'urllib3.poolmanager': <logging.Logger object at 0x1070a6e10>, 'Django.request': <logging.Logger object at 0x106d61290>, 'Django.template': <logging.Logger object at 0x10630dcd0>, 'Django.server': <logging.Logger object at 0x106dd6a50>, 'urllib3.connection': <logging.Logger object at 0x10710a350>,'urllib3.connectionpool': <logging.Logger object at 0x106e09690> ...}
その後、正確なロガーのレベルを設定します。
'loggers': {
'': {
'handlers': ['default'],
'level': 'DEBUG',
'propagate': True
},
'urllib3.connectionpool': {
'handlers': ['default'],
'level': 'WARNING',
'propagate' : False
},