Làm cách nào để tắt thông báo nhật ký từ thư viện Yêu cầu?


367

Theo mặc định, thư viện python Yêu cầu ghi thông điệp tường trình vào bàn điều khiển, dọc theo dòng:

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

Tôi thường không quan tâm đến những tin nhắn này và muốn vô hiệu hóa chúng. Điều gì sẽ là cách tốt nhất để làm im lặng những tin nhắn đó hoặc làm giảm tính dài dòng của Yêu cầu?


Câu trả lời:


573

Tôi đã tìm ra cách định cấu hình mức ghi nhật ký của yêu cầu , nó được thực hiện thông qua mô đun ghi nhật ký tiêu chuẩn . Tôi quyết định cấu hình nó để không đăng nhập tin nhắn trừ khi chúng ít nhất là cảnh báo:

import logging

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

Nếu bạn muốn áp dụng cài đặt này cho thư viện urllib3 (thường được sử dụng bởi các yêu cầu), hãy thêm vào như sau:

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

4
Tôi có cùng một vấn đề với pysimplesoap, và câu trả lời này giúp tôi cứu lấy ngày của mình
Janith Chinthana

2
Bạn có thể kết hợp hai dòng như thế này: log.getLogger ('request'). SetLevel (log.WARNING)
jpoppe

7
Tôi đã phải thêm dòng này cho bộ ghi "urllib3" để chặn các thông điệp nhật ký yêu cầu.
dgassaway

9
Tôi đã cần phải nhập nhật ký; log.getLogger ("urllib3"). setLevel (log.WARNING), quá. Logger cho "yêu cầu" không ngăn chặn những tin nhắn này.
m_messiah

4
Vì một số lý do khi sử dụng thư viện request trong python3, bạn phải thực hiện getLogger("urllib3")để chặn các tin nhắn.
robru

104

Trong trường hợp bạn đến đây để tìm cách sửa đổi ghi nhật ký của bất kỳ mô-đun (có thể được lồng sâu), hãy sử dụng logging.Logger.manager.loggerDictđể lấy từ điển của tất cả các đối tượng logger. Các tên được trả về sau đó có thể được sử dụng làm đối số cho 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)

Mỗi người dùng136036 trong một nhận xét, lưu ý rằng phương pháp này chỉ hiển thị cho bạn các logger tồn tại tại thời điểm bạn chạy đoạn trích trên. Ví dụ, nếu một mô-đun tạo một trình ghi nhật ký mới khi bạn khởi tạo một lớp, thì bạn phải đặt đoạn mã này sau khi tạo lớp để in tên của nó.


3
Cảm ơn bạn, điều này đã giúp tôi im lặng urllib3đăng nhập tin nhắn khi sử dụng boto3. Trình ghi nhật ký trong trường hợp như vậy là botocore.vendored.requests.packages.urllib3, vì vậy tôi đã sử dụng điều này: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)và cuối cùng tôi đã thoát khỏi các tin nhắn.
Bob Dem

Rất cám ơn vì điều này! Việc thay đổi các tiêu chí in ấn cho phép tôi cách ly rằng python-elSTERearch là thủ phạm trong trường hợp của tôi.
Robert Townley

2
Xin lưu ý rằng điều này sẽ không hoạt động khi các mô-đun tạo logger bên trong lớp của bạn mà bạn gọi sau, giống như APSchedulerkhi bạn gọi BackgroundScheduler.BackgroundScheduler().
dùng136036

@ user136036: các đối tượng logger là singletons, không thành vấn đề nếu bạn hoặc thư viện có thể tạo chúng trước. Nếu bạn sử dụng cùng tên với thư viện sử dụng, nó sẽ hoạt động .
Martijn Pieters

1
Tôi nghĩ rằng họ đang nói rằng nếu bạn liệt kê các logger trước khi thư viện tạo logger thì nó sẽ không được liệt kê. Cái nào đúng
kbrose

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

Theo cách này, tất cả các thông báo của level = INFO từ urllib3 sẽ không xuất hiện trong logfile.

Vì vậy, bạn có thể tiếp tục sử dụng level = INFO cho thông điệp tường trình của mình ... chỉ cần sửa đổi điều này cho thư viện bạn đang sử dụng.


4
Tôi đề nghị sử dụng setLevel(logging.WARNING)để đăng nhập cũng có thể cảnh báo và thông báo lỗi.
razz0

14

Hãy để tôi sao chép / dán phần tài liệu mà tôi đã viết khoảng một hoặc hai tuần trước, sau khi gặp sự cố tương tự như của bạn:

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

Điểm quan trọng của việc cụ thể hơn là "yêu cầu" là gì, từ một POV thực tế?
aknuds1

Nhưng bạn có được gì khi gọi log.getLogger ("request.packages.urllib3") thay vì log.getLogger ("request"), xem xét rằng bạn muốn ảnh hưởng đến việc ghi nhật ký của thư viện yêu cầu?
aknuds1

Bạn có nghĩa là bạn muốn kích hoạt đăng nhập trong request.packages.urllib3? Nếu vậy, bạn đang trả lời sai câu hỏi.
aknuds1

@ aknuds1 Tùy thuộc vào bạn nếu bạn muốn tắt hoặc bật chúng, tôi chỉ đặt mã kiểm soát hoàn toàn việc này :)
sorin

3
Tôi nghĩ bạn đã hiểu nhầm phạm vi của câu hỏi.
aknuds1

14

Đối với bất kỳ ai sử dụng, logging.config.dictConfigbạn có thể thay đổi cấp độ nhật ký thư viện yêu cầu trong từ điển như thế này:

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

@SebastianWagner Django sử dụng dictConfigdưới mui xe.
uhbif19

Cảm ơn bạn rất nhiều! Điều này là khá tốt. Một nơi để cai trị tất cả các nhật ký thư viện !! :)
MehmedB

5

Đặt tên logger là requestshoặcrequests.urllib3 không hoạt động đối với tôi. Tôi đã phải xác định tên logger chính xác để thay đổi mức ghi nhật ký.

Đầu tiên Xem những logger nào bạn đã xác định, để xem những cái nào bạn muốn loại bỏ

print(logging.Logger.manager.loggerDict)

Và bạn sẽ thấy một cái gì đó như thế này:

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

Sau đó cấu hình mức cho bộ ghi chính xác:

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

Những cấp độ này được đặt ở đâu?
javadba

Tôi có chúng trong cài đặt Django, trong cơ sở. Nơi để đặt chúng tất nhiên phụ thuộc vào thiết lập dự án của bạn.
Mikko

2

Nếu bạn có tập tin cấu hình, bạn có thể cấu hình nó.

Thêm urllib3 trong phần loggers:

[loggers]
keys = root, urllib3

Thêm phần logger_urllib3:

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

Đây là một câu trả lời hoàn toàn hợp lệ cho những người sử dụng tập tin cấu hình. Không chắc chắn tại sao nó có nhiều phiếu bầu?
Patrick

1

Câu trả lời này có ở đây: Python: làm thế nào để ngăn chặn các báo cáo ghi nhật ký từ các thư viện bên thứ ba?

Bạn có thể để mức ghi nhật ký mặc định cho basicConfig và sau đó bạn đặt mức DEBUG khi bạn nhận được trình ghi nhật ký cho mô-đun của mình.

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

Hướng dẫn của Kbrose về việc tìm kiếm logger nào đang tạo thông điệp tường trình là vô cùng hữu ích. Đối với dự án Django của tôi, tôi đã phải sắp xếp qua 120 logger khác nhau cho đến khi tôi thấy rằng đó là elasticsearchthư viện Python gây ra sự cố cho tôi. Theo hướng dẫn trong hầu hết các câu hỏi, tôi đã vô hiệu hóa nó bằng cách thêm phần này vào logger của mình:

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

Đăng bài ở đây trong trường hợp người khác nhìn thấy các thông điệp nhật ký không hữu ích xuất hiện bất cứ khi nào họ chạy truy vấn Elaticsearch.


-1

đơn giản: chỉ cần thêm requests.packages.urllib3.disable_warnings()sauimport requests


2
Tôi không tìm thấy phương pháp này trong phiên bản của tôi. Vô hiệu hóa cảnh báo là quá mức, vì các tin nhắn gây phiền nhiễu là mức độ INFO.
tripleee

-1

Tôi không chắc các cách tiếp cận trước đó đã ngừng hoạt động hay chưa, nhưng trong mọi trường hợp, đây là một cách khác để loại bỏ các cảnh báo:

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

Về cơ bản, thêm một biến môi trường trong bối cảnh thực thi tập lệnh.

Từ tài liệu: https://urllib3.readthedocs.org/en/latest/security.html#diseac-warnings

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.