リクエストライブラリからのログメッセージを無効にするにはどうすればよいですか?


367

デフォルトでは、Requests Pythonライブラリは次の行に沿ってログメッセージをコンソールに書き込みます。

Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606

私は通常これらのメッセージには興味がなく、無効にしたいと思います。それらのメッセージを黙らせるか、リクエストの冗長性を減らすための最良の方法は何でしょうか?


回答:


573

リクエストのログレベルを設定する方法を見つけました。これは標準のログモジュールを介して行われます。少なくとも警告でない限り、メッセージをログに記録しないように設定することにしました。

import logging

logging.getLogger("requests").setLevel(logging.WARNING)

この設定をurllib3ライブラリ(通常はリクエストで使用される)にも適用する場合は、以下を追加します。

logging.getLogger("urllib3").setLevel(logging.WARNING)

4
私にも同じ問題がpysimplesoapあり、この答えは私の日を救うのに役立ちます
Janith Chinthana '08 / 08/26

2
次のように2行を組み合わせることができます。logging.getLogger( 'requests')。setLevel(logging.WARNING)
jpoppe

7
リクエストログメッセージを抑制するために、「urllib3」ロガーにこの行を追加する必要がありました。
dgassaway、2015年

9
ロギングをインポートする必要がありました。logging.getLogger( "urllib3")。setLevel(logging.WARNING)も同様です。「リクエスト」のロガーはこれらのメッセージを防ぎません。
m_messiah 2015

4
何らかの理由でpython3で要求ライブラリを使用する場合getLogger("urllib3")、メッセージを抑制するために実行する必要があります。
robru

104

(おそらく深くネストされた)モジュールのロギングを変更する方法を探してここに来た場合は、を使用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ごとに、このメソッドは上記のスニペットを実行したときに存在するロガーのみを表示することに注意してください。たとえば、クラスをインスタンス化するときにモジュールが新しいロガーを作成する場合、クラスを作成したにこのスニペットを配置して、その名前を出力する必要があります。


3
ありがとう、これはurllib3を使用するときにログメッセージを無音にするのに役立ちましたboto3。そのような場合のロガーはbotocore.vendored.requests.packages.urllib3なので、これを使用しました:logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)そして、ようやくメッセージを取り除きました。
Bob Dem 2017

これに感謝します!印刷基準を変更すると、python-elasticsearchが私の場合の犯人であることがわかりました。
ロバートタウンリー2017年

2
これAPSchedulerは、が呼び出すときのように、モジュールが後で呼び出すクラス内にロガーを作成するときに機能しないことに注意してくださいBackgroundScheduler.BackgroundScheduler()
user136036 2018

@ user136036:ロガーオブジェクトはシングルトンです。あなたやライブラリが最初に作成するかどうかは関係ありません。ライブラリが使用しているのとまったく同じ名前を使用すると、機能します。
Martijn Pieters

1
ライブラリがロガーを作成する前にロガーをリストした場合、それはリストされないと彼らは言っていると思います。どちらが正しい。
kbrose

28
import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)

このようにして、urllib3からのlevel = INFOのすべてのメッセージがログファイルに存在しなくなります。

したがって、ログメッセージにlevel = INFOを使い続けることができます。使用しているライブラリに対してこれを変更するだけです。


4
を使用setLevel(logging.WARNING)して、警告メッセージやエラーメッセージも記録することをお勧めします。
razz0

14

あなたと同様の問題が発生した後、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')

実用的な視点から、単なる「リクエスト」よりも具体的であるとはどういう意味ですか?
aknuds1 2013

しかし、リクエストライブラリのロギングに影響を与えることを考慮して、logging.getLogger( "requests")の代わりにlogging.getLogger( "requests.packages.urllib3")を呼び出すことで何が得られますか?
aknuds1 2013

requests.packages.urllib3内でロギングを有効にしたいということですか?もしそうなら、あなたは間違った質問に答えています。
aknuds1 2013

@ aknuds1それらを無効または有効にするかどうかはあなた次第です。これを完全に制御するコードのみを配置します:)
sorin

3
質問の範囲を誤解していると思います。
aknuds1 2013年

14

を使用しlogging.config.dictConfigている人は、次のように辞書のリクエストライブラリログレベルを変更できます。

'loggers': {
    '': {
        'handlers': ['file'],
        'level': level,
        'propagate': False
    },
    'requests.packages.urllib3': {
        'handlers': ['file'],
        'level': logging.WARNING
    }
}

@SebastianWagner Djangoは内部で使用dictConfigします。
uhbif19

どうもありがとうございます!これはかなり良いです。すべてのライブラリログを統括する1つの場所!! :)
MehmedB

5

ロガー名をに設定する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
    },

これらのレベルはどこに設定されていますか?
javadba

Django設定のbase.pyにあります。もちろん、どこに配置するかはプロジェクトの設定によって異なります。
ミッコ

2

設定ファイルがあれば、設定できます。

ロガーセクションにurllib3を追加します。

[loggers]
keys = root, urllib3

logger_urllib3セクションを追加します。

[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool

これは、構成ファイルを使用する人にとって完全に有効な答えです。なぜ多くの反対票が投じられたのかわかりませんか?
Patrick

1

この答えはここにあります: Python:サードパーティのライブラリからのログステートメントを抑制する方法は?

basicConfigのデフォルトのロギングレベルをそのままにして、モジュールのロガーを取得するときにDEBUGレベルを設定できます。

logging.basicConfig(format='%(asctime)s %(module)s %(filename)s:%(lineno)s - %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug("my debug message")

1
import logging

# Only show warnings
logging.getLogger("urllib3").setLevel(logging.WARNING)

# Disable all child loggers of urllib3, e.g. urllib3.connectionpool
logging.getLogger("urllib3").propagate = False

0

ログメッセージを生成しているロガーを見つけるためのKbroseのガイダンスは非常に役に立ちました。私のDjangoプロジェクトでelasticsearchは、問題の原因となっているのはPythonライブラリであることが判明するまで、120の異なるロガーをソートする必要がありました。ほとんどの質問のガイダンスに従って、これをロガーに追加して無効にしました:

      ...
      'elasticsearch': {
          'handlers': ['console'],
          'level': logging.WARNING,
      },     
      ...

他の誰かがElasticsearchクエリを実行するたびに役に立たないログメッセージが表示されるのを見るために、ここに投稿します。


-1

シンプル:requests.packages.urllib3.disable_warnings()後に追加import requests


2
私のバージョンでは、このメソッドは見つかりませんでした。迷惑なメッセージは平準化されているため、警告を無効にするのは過度ですINFO
tripleee

-1

以前のアプローチが機能しなくなったかどうかはわかりませんが、いずれにしても、警告を削除する別の方法を次に示します。

PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py

基本的に、スクリプト実行のコンテキストで環境変数を追加します。

ドキュメントから:https : //urllib3.readthedocs.org/en/latest/security.html#disabling-warnings

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.