Günlük iletilerini İstekler kitaplığından nasıl devre dışı bırakabilirim?


367

Varsayılan olarak, İstekler python kitaplığı günlük iletilerini konsola şu satırlarda yazar:

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

Genellikle bu iletilerle ilgilenmiyorum ve bunları devre dışı bırakmak istiyorum. Bu mesajları susturmanın veya Taleplerin ayrıntı düzeyini azaltmanın en iyi yolu nedir?


Yanıtlar:


573

İsteklerin günlüğe kaydetme düzeyini nasıl yapılandıracağımı öğrendim , standart günlükleme modülü aracılığıyla yapılır . En azından uyarılar olmadıkça iletileri günlüğe kaydetmeyecek şekilde yapılandırmaya karar verdim:

import logging

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

Bu ayarı urllib3 kitaplığı (genellikle isteklerde kullanılır) için de uygulamak istiyorsanız, aşağıdakileri ekleyin:

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

4
pysimplesoap
İle

2
Bunun gibi iki satırı birleştirebilirsiniz: logging.getLogger ('request'). SetLevel (logging.WARNING)
jpoppe

7
Ben istekleri günlük iletileri bastırmak için "urllib3" logger için bu satırı eklemek zorunda kaldı.
dgassaway

9
Günlük almam gerekiyordu; logging.getLogger ("urllib3"). setLevel (logging.WARNING) de. "İstekler" günlükçüsü bu iletileri engellemez.
m_messiah

4
Bazı nedenlerden dolayı python3'te istek kitaplığını kullanırken getLogger("urllib3")iletileri bastırmak için yapmanız gerekir.
robru

104

Buraya, herhangi bir (muhtemelen derinden iç içe) modülün günlüğünü değiştirmenin bir yolunu aramaya geldiyseniz logging.Logger.manager.loggerDict, tüm günlükçü nesnelerinin sözlüğünü almak için kullanın . Döndürülen adlar daha sonra aşağıdakiler için bağımsız değişken olarak kullanılabilir 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)

Bir yorumdaki kullanıcı136036'ya göre, bu yöntemin yalnızca yukarıdaki snippet'i çalıştırdığınızda mevcut olan günlükçüleri gösterdiğini unutmayın. Örneğin, bir modül bir sınıfı başlatırken yeni bir günlükçü oluşturursa, sınıfını oluşturduktan sonra adını yazdırmak için bu snippet'i koymanız gerekir .


3
Teşekkür ederim, bu urllib3kullanırken günlük mesajlarını susturmamı sağladı boto3. Böyle bir durumda logger botocore.vendored.requests.packages.urllib3, bu yüzden kullandım: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)ve sonunda mesajlardan kurtuldum.
Bob Dem

Bunun için çok teşekkürler! Baskı kriterlerini değiştirmek benim durumumda python-elasticsearch'ün suçlu olduğunu izole etmeme izin verdi.
Robert Townley

2
Modüller, daha sonra arayacağınız sınıflarında günlükçilerini oluşturduğunda, aradığınızda olduğu gibi bunun APSchedulerişe yaramayacağını unutmayın BackgroundScheduler.BackgroundScheduler().
user136036

@ user136036: logger nesneleri tek tonludur, siz veya kütüphanenin önce bunları oluşturup oluşturmaması önemli değildir. Kitaplığın kullandığı adla tam olarak aynı adı kullanırsanız çalışır .
Martijn Pieters

1
Sanırım kütükleri kütüphane oluşturmadan önce listelerseniz, o zaman listelenmeyeceğini söylüyorlar. Hangisi doğru.
kbrose

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

Bu şekilde urllib3'ten level = INFO iletilerinin tümü günlük dosyasında bulunmaz.

Böylece günlük mesajlarınız için level = INFO kullanmaya devam edebilirsiniz ... sadece bunu kullandığınız kütüphane için değiştirin.


4
setLevel(logging.WARNING)Ayrıca olası uyarı ve hata iletilerini günlüğe kaydetmenizi öneririm .
razz0

14

Size benzer bir sorun yaşadıktan sonra, yaklaşık iki hafta önce yazdığım belgeler bölümünü kopyalayıp yapıştırmama izin verin:

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

Pratik bir POV'dan sadece 'taleplerden' daha belirgin olmanın anlamı nedir?
Mayıs 2013

Ancak, istek kitaplığının günlüğünü etkilemek istediğinizi düşünerek, logging.getLogger ("istek") yerine logging.getLogger ("requests.packages.urllib3") 'yi çağırarak ne kazanırsınız?
aknuds1

Requests.packages.urllib3 içinde günlüğe kaydetmeyi etkinleştirmek istediğiniz anlamına mı geliyor? Öyleyse, yanlış soruyu cevaplıyorsunuz.
aknuds1

@ aknuds1 Devre dışı bırakmak veya etkinleştirmek istiyorsanız size kalmış, sadece bunu tamamen kontrol eden kodu koydum :)
sorin

3
Bence sorunun kapsamını yanlış anladınız.
aknuds1

14

Kullanan herkes logging.config.dictConfigiçin sözlükte istek kitaplığı günlük düzeyini aşağıdaki gibi değiştirebilirsiniz:

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

@SebastianWagner Django dictConfigkaputun altında kullanır .
uhbif19

Çok teşekkür ederim! Bu oldukça iyi. Tüm kütüphane günlüklerini yönetmek için tek bir yer! :)
MehmedB

5

Kaydedici adını benim için ayarlamadı requestsveya requests.urllib3işe yaramadı. Günlük kaydı düzeyini değiştirmek için kesin günlükçünün adını belirtmem gerekiyordu.

Öncelikle hangilerini silmek istediğinizi görün, hangilerini kaldırmak istediğinizi görün

print(logging.Logger.manager.loggerDict)

Ve şöyle bir şey göreceksiniz:

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

Ardından, kesin kaydedici için düzeyi yapılandırın:

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

bu seviyeler nerede belirlenir?
javadba

Onları base.py'deki Django ayarlarında buldum. Bunları nereye koyacağınız elbette proje kurulumunuza bağlıdır.
Mikko

2

Yapılandırma dosyanız varsa, yapılandırabilirsiniz.

Kaydediciler bölümüne urllib3 ekleyin:

[loggers]
keys = root, urllib3

Logger_urllib3 bölümü ekle:

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

Bu, yapılandırma dosyasını kullanan kişiler için mükemmel bir cevaptır. Neden bu kadar çok aşağı oy aldığından emin değil misiniz?
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

Kbrose'un hangi günlükçünün günlük mesajları oluşturduğuna dair rehberliği son derece yararlıydı. Django projem için 120 farklı kaydediciyi sıralamak zorunda kaldım.elasticsearch benim için sorunlara neden Python kütüphanesi olduğunu . Soruların çoğundaki rehberliğe göre, bunu günlükçülerime ekleyerek devre dışı bıraktım:

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

Başkalarının yararsız günlük iletilerini bir Elasticsearch sorgusu çalıştırdıklarında görmeleri durumunda buraya gönderme.


-1

basit: sadece requests.packages.urllib3.disable_warnings()sonra ekleimport requests


2
Bu yöntemi sürümümde bulamadım. Sinir bozucu mesajlar düz olduğundan uyarıları devre dışı bırakmak aşırıdır INFO.
tripleee

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.