Come disabilitare i messaggi di registro dalla libreria Richieste?


367

Per impostazione predefinita, la libreria python Requests scrive i messaggi di registro sulla console, seguendo le linee di:

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

Di solito non sono interessato a questi messaggi e vorrei disabilitarli. Quale sarebbe il modo migliore per mettere a tacere quei messaggi o ridurre la verbosità delle Richieste?


Risposte:


573

Ho scoperto come configurare il livello di registrazione delle richieste , tramite il modulo di registrazione standard . Ho deciso di configurarlo per non registrare i messaggi a meno che non siano almeno avvisi:

import logging

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

Se si desidera applicare questa impostazione anche alla libreria urllib3 (generalmente utilizzata dalle richieste), aggiungere quanto segue:

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

4
Ho lo stesso problema con pysimplesoap, e questa risposta mi aiuta a salvare la mia giornata
Janith Chinthana il

2
È possibile combinare le due righe in questo modo: logging.getLogger ('richieste'). SetLevel (logging.WARNING)
jpoppe

7
Ho dovuto aggiungere questa riga per il logger "urllib3" per sopprimere i messaggi di registro delle richieste.
dgassaway,

9
Avevo bisogno di importare la registrazione; logging.getLogger ("urllib3"). setLevel (logging.WARNING). Logger per "richieste" non impedisce questi messaggi.
m_messiah,

4
Per qualche motivo quando si utilizza la libreria delle richieste in python3, è necessario fare getLogger("urllib3")per eliminare i messaggi.
Robru,

104

Nel caso in cui venissi qui alla ricerca di un modo per modificare la registrazione di qualsiasi modulo (possibilmente profondamente annidato), usa logging.Logger.manager.loggerDict per ottenere un dizionario di tutti gli oggetti logger. I nomi restituiti possono quindi essere utilizzati come argomento per 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)

Per utente 136036 in un commento, tieni presente che questo metodo mostra solo i logger esistenti al momento dell'esecuzione dello snippet precedente. Se, ad esempio, un modulo crea un nuovo logger quando si crea un'istanza di una classe, è necessario inserire questo snippet dopo aver creato la classe per stampare il suo nome.


3
Grazie, questo mi ha aiutato a mettere a tacere i urllib3messaggi di registro durante l'utilizzo boto3. Il logger in questo caso è botocore.vendored.requests.packages.urllib3, quindi ho usato questo: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)e finalmente mi sono liberato dei messaggi.
Bob Dem,

Mille grazie per questo! La modifica dei criteri di stampa mi ha permesso di isolare il fatto che python-elasticsearch era il colpevole nel mio caso.
Robert Townley,

2
Ricorda che questo non funzionerà quando i moduli creano i loro logger all'interno della loro classe che chiameresti più tardi, come APSchedulersuccede quando chiami BackgroundScheduler.BackgroundScheduler().
user136036,

@ user136036: gli oggetti logger sono singoli, non importa se tu o la libreria riesci a crearli per primi. Se usi esattamente lo stesso nome usato dalla libreria, funzionerà .
Martijn Pieters

1
Penso che stiano dicendo che se elenchi i logger prima che una libreria abbia creato il suo logger, allora non verrà elencato. Che è corretto.
kbrose,

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

In questo modo tutti i messaggi di livello = INFO da urllib3 non saranno presenti nel file di registro.

Quindi puoi continuare a utilizzare il livello = INFO per i tuoi messaggi di registro ... basta modificarlo per la libreria che stai utilizzando.


4
Suggerisco di utilizzare setLevel(logging.WARNING)per registrare anche possibili messaggi di avvertimento ed errore.
razz0,

14

Lasciami copiare / incollare la sezione della documentazione che ho scritto circa una settimana o due fa, dopo aver avuto un problema simile al tuo:

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

Qual è il punto di essere più specifico delle semplici "richieste", però, da un POV pratico?
Aknuds1

Ma cosa ottieni chiamando logging.getLogger ("request.packages.urllib3") invece di logging.getLogger ("richieste"), considerando che vuoi influenzare la registrazione della libreria delle richieste?
aknuds1,

Vuoi dire che desideri abilitare la registrazione all'interno di request.packages.urllib3? In tal caso, stai rispondendo alla domanda sbagliata.
Aknuds1,

@ aknuds1 Dipende da te se vuoi disabilitarli o abilitarli, metto solo il codice che controlla completamente questo :)
sorin

3
Penso che tu abbia frainteso la portata della domanda.
aknuds1,

14

Per chiunque utilizzi logging.config.dictConfigè possibile modificare il livello di registro della libreria delle richieste nel dizionario in questo modo:

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

@SebastianWagner Django usa dictConfigsotto il cofano.
uhbif19,

Grazie mille! Questo è abbastanza buono. Un posto per governare tutti i registri della biblioteca !! :)
MehmedB

5

Impostazione del nome del logger come requestsorequests.urllib3 non ha funzionato per me. Ho dovuto specificare il nome esatto del logger per modificare il livello di registrazione.

Per prima cosa vedi quali logger hai definito, per vedere quali vuoi rimuovere

print(logging.Logger.manager.loggerDict)

E vedrai qualcosa del genere:

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

Quindi configurare il livello per il logger esatto:

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

dove sono impostati questi livelli?
Javavba,

Li ho nelle impostazioni di Django, in base.py. Dove metterli ovviamente dipende dalla configurazione del progetto.
Mikko,

2

Se hai un file di configurazione, puoi configurarlo.

Aggiungi urllib3 nella sezione logger:

[loggers]
keys = root, urllib3

Aggiungi la sezione logger_urllib3:

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

Questa è una risposta perfettamente valida per le persone che usano il file di configurazione. Non sai perché ha ottenuto così tanti voti negativi?
Patrick,


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

La guida di Kbrose per scoprire quale logger stava generando messaggi di log era immensamente utile. Per il mio progetto Django, ho dovuto ordinare 120 diversi logger finché non ho scoperto che era la elasticsearchlibreria Python a causare problemi per me. Come da guida nella maggior parte delle domande, l'ho disabilitato aggiungendo questo ai miei logger:

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

Pubblicando qui nel caso in cui qualcun altro stia vedendo i messaggi di log inutili che arrivano ogni volta che eseguono una query Elasticsearch.


-1

semplice: basta aggiungere requests.packages.urllib3.disable_warnings()dopoimport requests


2
Non ho trovato questo metodo nella mia versione. La disabilitazione degli avvisi è eccessiva, poiché i messaggi fastidiosi sono a livello INFO.
tripleee,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.