web-dev-qa-db-fra.com

Comment désactiver les messages de journal de la bibliothèque de demandes?

Par défaut, la bibliothèque Requests python écrit les messages de journal dans la console, selon les lignes suivantes:

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

Ces messages ne m'intéressent généralement pas et je voudrais les désactiver. Quel serait le meilleur moyen de faire taire ces messages ou de diminuer la verbosité de Requests?

299
aknuds1

J'ai découvert comment configurer le niveau de journalisation de request, via le module standard logging . J'ai décidé de le configurer pour qu'il n'enregistre pas les messages sauf s'ils sont au moins des avertissements:

import logging

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

Si vous souhaitez également appliquer ce paramètre à la bibliothèque urllib3 (généralement utilisée par les requêtes), ajoutez ce qui suit:

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

Si vous êtes venu ici pour chercher un moyen de modifier la journalisation de tout module (éventuellement profondément imbriqué), utilisez logging.Logger.manager.loggerDict pour obtenir un dictionnaire de tous les objets de journalisation. Les noms retournés peuvent ensuite être utilisés comme argument de 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)

Par utilisateur 136036 dans un commentaire, sachez que cette méthode ne vous montre que les enregistreurs existants au moment où vous exécutez l'extrait de code ci-dessus. Si, par exemple, un module crée un nouvel enregistreur lorsque vous instanciez une classe, vous devez placer cet extrait de code après en créant la classe afin d’imprimer son nom.

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

De cette manière, tous les messages de niveau = INFO de urllib3 ne seront pas présents dans le fichier journal.

Vous pouvez donc continuer à utiliser le niveau = INFO pour vos messages de journal ... modifiez-le simplement pour la bibliothèque que vous utilisez.

27
shaolin

Permettez-moi de copier/coller la section de documentation sur laquelle j’ai écrit il ya environ une semaine ou deux, après avoir eu un problème similaire au vôtre:

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')
14
sorin

Pour quiconque utilisant logging.config.dictConfig, vous pouvez modifier le niveau de journalisation de la bibliothèque de requêtes dans le dictionnaire, comme suit:

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

Si vous avez un fichier de configuration, vous pouvez le configurer.

Ajoutez urllib3 dans la section des enregistreurs:

[loggers]
keys = root, urllib3

Ajouter la section logger_urllib3:

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

Les conseils de Kbrose pour savoir quel enregistreur générait des messages de journal étaient extrêmement utiles. Pour mon projet Django, j'ai dû trier 120 enregistreurs différents jusqu'à ce que je découvre que c'était la bibliothèque elasticsearch Python qui me posait problème. Comme indiqué dans la plupart des questions, je l’ai désactivé en ajoutant ceci à mes enregistreurs:

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

Publier ici au cas où quelqu'un verrait les messages inutiles du journal chaque fois qu'ils lanceraient une requête Elasticsearch.

0
Robert Townley

Définir le nom de l’enregistreur sur requests ou requests.urllib3 ne fonctionnait pas pour moi. Je devais spécifier le nom exact du logger pour changer le niveau de journalisation.

Commencez par identifier les enregistreurs que vous avez définis et ceux que vous souhaitez supprimer.

print(logging.Logger.manager.loggerDict)

Et vous verrez quelque chose comme ça:

{...'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> ...}

Configurez ensuite le niveau pour le logger exact:

   'loggers': {
    '': {
        'handlers': ['default'],
        'level': 'DEBUG',
        'propagate': True
    },
    'urllib3.connectionpool': {
        'handlers': ['default'],
        'level': 'WARNING',
        'propagate' : False
    },
0
Mikko