ฉันจะปิดการใช้งานข้อความบันทึกจากไลบรารีคำขอได้อย่างไร


367

ตามค่าเริ่มต้นไลบรารี python คำขอจะเขียนข้อความบันทึกไปยังคอนโซลตามบรรทัดต่อไปนี้:

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

ฉันมักจะไม่สนใจข้อความเหล่านี้และต้องการปิดการใช้งาน อะไรจะเป็นวิธีที่ดีที่สุดในการปิดเสียงข้อความเหล่านั้นหรือลดความฟุ้งซ่านของคำขอ?


ที่เกี่ยวข้อง: nginx และ gunicorn
Martin Thoma

คำตอบ:


573

ฉันพบวิธีกำหนดค่าระดับการบันทึกของคำขอทำได้ผ่านโมดูลการบันทึกมาตรฐาน ฉันตัดสินใจที่จะกำหนดค่าให้ไม่บันทึกข้อความยกเว้นว่าเป็นคำเตือนอย่างน้อย:

import logging

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

หากคุณต้องการใช้การตั้งค่านี้สำหรับไลบรารี urllib3 (โดยทั่วไปจะใช้โดยคำขอ) ให้เพิ่มรายการต่อไปนี้:

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

4
ฉันมีปัญหาเดียวกันกับpysimplesoapและคำตอบนี้ช่วยฉันประหยัดวันของฉัน
Janith Chinthana

2
คุณสามารถรวมสองบรรทัดดังนี้: logging.getLogger ('ร้องขอ') setLevel (logging.WARNING)
jpoppe

7
ฉันต้องเพิ่มบรรทัดนี้สำหรับตัวบันทึก "urllib3" เพื่อไม่ให้มีการร้องขอข้อความบันทึก
dgassaway

9
ฉันต้องนำเข้าการบันทึก logging.getLogger ("urllib3"). setLevel (logging.WARNING) เช่นกัน คนตัดไม้สำหรับ "คำขอ" ไม่ได้ป้องกันข้อความเหล่านี้
m_messiah

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)

ต่อผู้ใช้ 136036 ในความคิดเห็นโปรดทราบว่าวิธีนี้จะแสดงเฉพาะตัวบันทึกที่มีอยู่ในเวลาที่คุณเรียกใช้ตัวอย่างข้างต้น ตัวอย่างเช่นถ้าโมดูลสร้างตัวบันทึกใหม่เมื่อคุณสร้างอินสแตนซ์ของคลาสคุณจะต้องวางข้อมูลโค้ดนี้หลังจากสร้างคลาสเพื่อพิมพ์ชื่อ


3
ขอบคุณนี้ช่วยให้ผมเงียบข้อความเข้าสู่ระบบเมื่อใช้urllib3 boto3คนตัดไม้ในกรณีเช่นนี้คือbotocore.vendored.requests.packages.urllib3ดังนั้นฉันจึงใช้สิ่งนี้logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)และในที่สุดฉันก็กำจัดข้อความ
Bob Dem

ขอบคุณมากสำหรับสิ่งนี้! การเปลี่ยนเกณฑ์การพิมพ์ทำให้ฉันแยกได้ว่า python-elasticsearch เป็นตัวการในกรณีของฉัน
Robert Townley

2
โปรดทราบว่านี้จะไม่ทำงานเมื่อโมดูลสร้างตัดไม้ของพวกเขาภายในชั้นเรียนของตนที่คุณต้องการเรียกต่อมาเช่นไม่เมื่อคุณเรียกAPScheduler BackgroundScheduler.BackgroundScheduler()
user136036

@ user136036: วัตถุคนตัดไม้เป็นซิงเกิลตันมันไม่สำคัญว่าคุณหรือห้องสมุดจะต้องสร้างมันก่อน หากคุณใช้ชื่อเดียวกันกับการใช้ห้องสมุดมันจะทำงาน
Martijn Pieters

1
ฉันคิดว่าพวกเขากำลังพูดว่าถ้าคุณทำรายการตัวบันทึกก่อนที่ไลบรารีจะสร้างตัวบันทึกมันจะไม่ถูกแสดง ซึ่งถูกต้อง
kbrose

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

ด้วยวิธีนี้ข้อความทั้งหมดของระดับ = INFO จาก urllib3 จะไม่ปรากฏใน logfile

ดังนั้นคุณสามารถใช้ระดับ = INFO สำหรับข้อความบันทึกของคุณได้ ... เพียงแค่ปรับเปลี่ยนสิ่งนี้สำหรับไลบรารีที่คุณใช้


4
ฉันขอแนะนำให้ใช้setLevel(logging.WARNING)เพื่อเข้าสู่ระบบนอกจากนี้ยังมีคำเตือนและข้อความแสดงข้อผิดพลาด
razz0

14

ให้ฉันคัดลอก / วางส่วนเอกสารที่ฉันเขียนเกี่ยวกับหนึ่งหรือสองสัปดาห์ที่ผ่านมาหลังจากมีปัญหาคล้ายกับของคุณ:

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

อะไรคือจุดประสงค์ที่เฉพาะเจาะจงมากกว่า 'คำขอ' จาก POV เชิงปฏิบัติ
aknuds1

แต่สิ่งที่คุณจะได้รับจากการเรียก logging.getLogger ("requests.packages.urllib3") แทน logging.getLogger ("คำร้องขอ") โดยพิจารณาว่าคุณต้องการส่งผลต่อการบันทึกของไลบรารีการร้องขอหรือไม่
aknuds1

คุณหมายความว่าคุณต้องการเปิดใช้งานการบันทึกภายใน requests.packages.urllib3 หรือไม่? ถ้าเป็นเช่นนั้นคุณกำลังตอบคำถามที่ผิด
aknuds1

@ aknuds1 มันขึ้นอยู่กับคุณถ้าคุณต้องการที่จะปิดการใช้งานหรือเปิดใช้งานพวกเขาผมเพียงนำรหัสที่ได้อย่างเต็มที่ควบคุมนี้ :)
โซริน

3
ฉันคิดว่าคุณเข้าใจผิดขอบเขตของคำถาม
aknuds1

14

สำหรับใครก็ตามที่ใช้logging.config.dictConfigคุณสามารถเปลี่ยนระดับการบันทึกไลบรารีคำขอในพจนานุกรมเช่นนี้:

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

@SebastianWagner Django ใช้dictConfigภายใต้ประทุน
uhbif19

ขอบคุณมาก! อันนี้ค่อนข้างดี ที่เดียวที่จะครอบครองบันทึกของห้องสมุดทั้งหมด !! :)
MehmedB

5

การตั้งชื่อตัวบันทึกเป็นrequestsหรือใช้งานrequests.urllib3ไม่ได้สำหรับฉัน ฉันต้องระบุชื่อคนตัดไม้ที่แน่นอนเพื่อเปลี่ยนระดับการบันทึก

ขั้นแรกดูว่าคุณกำหนด loggers ตัวใดเพื่อดูว่าคุณต้องการลบตัวไหน

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 แน่นอนว่าจะนำไปใช้ที่ใดขึ้นกับการตั้งค่าโครงการของคุณ
Mikko

2

หากคุณมีไฟล์กำหนดค่าคุณสามารถกำหนดค่าได้

เพิ่ม urllib3 ในส่วนของตัวบันทึก:

[loggers]
keys = root, urllib3

เพิ่ม logger_urllib3 ส่วน:

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

นี่เป็นคำตอบที่ถูกต้องสมบูรณ์แบบสำหรับผู้ที่ใช้ไฟล์กำหนดค่า ไม่แน่ใจว่าทำไมมันถึงลงคะแนนเสียงมากมาย?
Patrick

1

คำตอบนี้อยู่ที่นี่: Python: วิธีการระงับคำสั่งการบันทึกจากห้องสมุดบุคคลที่สาม?

คุณสามารถออกจากระดับการบันทึกเริ่มต้นสำหรับ basicConfig จากนั้นคุณตั้งค่าระดับการดีบักเมื่อคุณได้รับตัวบันทึกสำหรับโมดูลของคุณ

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


0

คำแนะนำของ Kbrose ในการค้นหาตัวบันทึกข้อความที่กำลังสร้างข้อความบันทึกนั้นมีประโยชน์อย่างมาก สำหรับโครงการ Django ของฉันฉันต้องเรียงลำดับตัวล็อก 120 ตัวที่แตกต่างกันจนกว่าฉันจะพบว่ามันเป็นelasticsearchห้องสมุด Python ที่ทำให้เกิดปัญหากับฉัน ตามคำแนะนำในคำถามส่วนใหญ่ฉันปิดการใช้งานโดยเพิ่มสิ่งนี้ลงในตัวบันทึกของฉัน:

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