আমি কীভাবে অনুরোধ লাইব্রেরি থেকে লগ বার্তাগুলি অক্ষম করব?


367

ডিফল্টরূপে, অনুরোধগুলি পাইথন লাইব্রেরি কনসোলে লগ বার্তা লেখায়, এর লাইনগুলি সহ:

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

আমি সাধারণত এই বার্তাগুলিতে আগ্রহী না এবং এগুলি অক্ষম করতে চাই। এই বার্তাগুলি নিঃশব্দ করার জন্য বা অনুরোধগুলির শব্দভাণ্ডার হ্রাস করার সর্বোত্তম উপায় কী হবে?


উত্তর:


573

আমি অনুরোধের লগিং স্তরটি কীভাবে কনফিগার করতে পারি তা স্ট্যান্ডার্ড লগিং মডিউলটির মাধ্যমে সম্পন্ন করেছি । আমি বার্তা লগ না করার জন্য এটি কনফিগার করার সিদ্ধান্ত নিয়েছি যদি না তারা কমপক্ষে সতর্কতা না দেয়:

import logging

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

আপনি যদি urlib3 লাইব্রেরির জন্য (সাধারণত অনুরোধ দ্বারা ব্যবহৃত) এই সেটিংটি প্রয়োগ করতে চান তবে নিম্নলিখিতটি যুক্ত করুন:

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

4
আমারও একই সমস্যা আছে pysimplesoapএবং এই উত্তরটি আমাকে আমার দিন বাঁচাতে সহায়তা করে
জ্যানিথ চিন্তানা

2
আপনি দুই লাইন ভালো একত্রিত পারে: logging.getLogger (অনুরোধ ') setLevel (logging.WARNING)।
jpoppe

7
অনুরোধ লগ বার্তাগুলি দমন করতে আমাকে "urllib3" লগারের জন্য এই লাইনটি যুক্ত করতে হয়েছিল।
dgassaway

9
আমার লগিং আমদানি করা দরকার ছিল; logging.getLogger ("urllib3")। সেটও লেভেল (লগিং WARওয়ার্নিং)। "অনুরোধগুলির" জন্য লগার এই বার্তাগুলি প্রতিরোধ করে না।
এম_মেসিয়াহ

4
পাইথন 3-তে অনুরোধের লাইব্রেরিটি ব্যবহার করার সময় কোনও কারণে আপনাকে getLogger("urllib3")বার্তাগুলিকে দমন করতে হবে ।
রব্রু

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)

এক মন্তব্য 13136036 প্রতি ব্যবহারকারী হিসাবে, সাবধান থাকুন যে এই পদ্ধতিটি কেবলমাত্র আপনি উপরের স্নিপেটটি চালানোর সময় উপস্থিত লগারদের দেখায়। উদাহরণস্বরূপ, কোনও শ্রেণি ইনস্ট্যান্ট করার সময় যদি কোনও মডিউল একটি নতুন লগার তৈরি করে, তবে ক্লাসটি তৈরির পরে আপনাকে এই স্নিপেটটি অবশ্যই প্রিন্ট করতে হবে et


3
আপনাকে ধন্যবাদ, এটি আমাকে urllib3ব্যবহার করার সময় লগ বার্তাগুলি নীরব করতে সহায়তা করেছিল boto3। এই ক্ষেত্রে লগারটি হ'ল botocore.vendored.requests.packages.urllib3, তাই আমি এটি ব্যবহার করেছি: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)এবং অবশেষে আমি বার্তাগুলি থেকে মুক্তি পেয়েছি।
বব ডেম

এর জন্য অনেক ধন্যবাদ! মুদ্রণের মানদণ্ডে পরিবর্তন আনার ফলে আমার পৃথক হয়ে যায় যে পাইথন-ইলাস্টিকসर्चটি আমার ক্ষেত্রে অপরাধী।
রবার্ট টাউনলি

2
APSchedulerআপনি যখন কল করবেন তখন যেমন মডিউলগুলি তাদের ক্লাসের মধ্যে তাদের লগার তৈরি করে যখন আপনি পরে কল করবেন তখন এটি কাজ করবে না সে বিষয়ে সচেতন হন BackgroundScheduler.BackgroundScheduler()
ব্যবহারকারী 136036

@ ব্যবহারকারী 136036: লগার অবজেক্টগুলি সিলেটলেটস, আপনি বা লাইব্রেরিটি প্রথমে সেগুলি তৈরি করে কিনা তা বিবেচ্য নয়। আপনি যদি লাইব্রেরিটির ঠিক একই নাম ব্যবহার করেন তবে এটি কাজ করবে
মার্টিজন পিটারস

1
আমি মনে করি তারা বলছে যে আপনি যদি কোনও লাইব্রেরির লগার তৈরি করার আগে লগার তালিকাভুক্ত করেন তবে তা তালিকাভুক্ত হবে না। যা সঠিক.
kbrose

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

এইভাবে urllib3 থেকে স্তর = INFO এর সমস্ত বার্তা লগফাইলে উপস্থিত হবে না।

সুতরাং আপনি আপনার লগ বার্তাগুলির জন্য স্তর = 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')

ব্যবহারিক পিওভের কাছ থেকে কেবল 'অনুরোধগুলি' করার চেয়ে আরও সুনির্দিষ্ট হওয়ার বিষয় কী?
aknuds1

কিন্তু আপনি অনুরোধের লাইব্রেরির লগিংকে প্রভাবিত করতে চান তা বিবেচনা করে আপনি লগিং.সেটলোগার ("অনুরোধগুলি" "অনুরোধগুলি") পরিবর্তে লগিং.কেটলগার ("অনুরোধ.প্যাকেজস.urllib3") কল করে কী অর্জন করবেন?
aknuds1

আপনি কি চাইছেন যে আপনি অনুরোধ.প্যাকগুলি.আরলিব 3 এর মধ্যে লগিং সক্ষম করতে চান? যদি তা হয় তবে আপনি ভুল প্রশ্নের উত্তর দিচ্ছেন।
aknuds1

@ aknuds1 আপনি যদি তাদের অক্ষম করতে বা সক্ষম করতে চান তবে এটি কেবলমাত্র আমিই কোডটি রেখেছি যা এটি পুরোপুরি নিয়ন্ত্রণ করে :)
সোরিন

3
আমি মনে করি আপনি প্রশ্নের সুযোগটি ভুল বুঝে গেছেন।
aknuds1

14

যে কেউ আপনার ব্যবহারের logging.config.dictConfigজন্য অভিধানে অনুরোধের লাইব্রেরি লগ স্তরটিকে এভাবে পরিবর্তন করতে পারেন:

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

@ সেবাস্তিয়ান ওয়াগনার জ্যাঙ্গো dictConfigহুডের নীচে ব্যবহার করে।
uhbif19

তোমাকে অনেক ধন্যবাদ! এটি বেশ ভাল। সমস্ত জায়গায় লাইব্রেরির লগগুলিকে নিয়ম করতে একটি জায়গা !! :)
মেহমেডবি

5

লগারের নাম হিসাবে সেট করা requestsবা requests.urllib3আমার পক্ষে কাজ করে নি। লগিংয়ের স্তরটি পরিবর্তন করতে আমাকে সঠিক লগার নামটি নির্দিষ্ট করতে হয়েছিল।

আপনি কোনটি মুছে ফেলতে চান তা দেখতে প্রথমে আপনি কোন লগার সংজ্ঞায়িত করেছেন তা দেখুন

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
    },

এই স্তরগুলি কোথায় সেট করা আছে?
জাভাদ্বা

আমার কাছে সেগুলি জ্যাঙ্গো সেটিংসে, বেস.পি. এগুলি অবশ্যই কোথায় রাখবেন তা আপনার প্রকল্পের সেটআপের উপর নির্ভর করে।
মিক্কো

2

আপনার যদি কনফিগারেশন ফাইল থাকে তবে আপনি এটি কনফিগার করতে পারেন।

লগার বিভাগে urllib3 যুক্ত করুন:

[loggers]
keys = root, urllib3

লগার_আরলিব 3 বিভাগ যুক্ত করুন:

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

কনফিগারেশন ফাইলটি ব্যবহার করে এমন লোকদের জন্য এটি একটি সঠিক বৈধ উত্তর। নিশ্চিত কেন এটি এত নিচে ভোট পেয়েছে?
প্যাট্রিক

1

এই উত্তরটি এখানে: পাইথন: তৃতীয় পক্ষের লাইব্রেরি থেকে লগিং বিবৃতি কীভাবে দমন করা যায়?

আপনি বেসিককনফাইগের জন্য ডিফল্ট লগিং স্তরটি ছেড়ে যেতে পারেন এবং তারপরে আপনি যখন আপনার মডিউলটির জন্য লগার পাবেন তখন আপনি DEBUG স্তরটি সেট করবেন।

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

কোন লগার লগ বার্তা উত্পন্ন করছিল সে সম্পর্কে কেব্রোসের দিকনির্দেশ অত্যন্ত কার্যকর ছিল। আমার জ্যাঙ্গো প্রকল্পের জন্য, আমাকে এটির জন্য elasticsearchপাইথন লাইব্রেরি যা আমার জন্য সমস্যা সৃষ্টি করছে তা না হওয়া পর্যন্ত আমাকে বিভিন্ন 120 লগারের মধ্যে বাছাই করতে হয়েছিল। বেশিরভাগ প্রশ্নের দিকনির্দেশনা অনুসারে, আমি এটি আমার লগারে যুক্ত করে এটি অক্ষম করেছি:

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

অন্য কেউ যদি কোনও ইলাস্টিক অনুসন্ধান জিজ্ঞাসা চালায় তখন অপ্রয়োজনীয় লগ বার্তাগুলি আসতে দেখছে এমন ক্ষেত্রে এখানে পোস্ট করা।


-1

সরল: শুধু requests.packages.urllib3.disable_warnings()পরে যোগ করুনimport requests


2
আমি আমার সংস্করণে এই পদ্ধতিটি পাইনি। বিরক্তিকর বার্তা স্তর হওয়ায় সতর্কতাগুলি অক্ষম করা অতিরিক্ত INFO
ট্রিপলি

-1

পূর্ববর্তী পদ্ধতিগুলি কাজ করা বন্ধ করে দিয়েছে কিনা তা আমি নিশ্চিত নই, তবে যে কোনও ক্ষেত্রে সতর্কতাগুলি অপসারণের আরও একটি উপায় এখানে রয়েছে:

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

মূলত, স্ক্রিপ্ট প্রয়োগের প্রসঙ্গে পরিবেশের পরিবর্তনশীল যুক্ত করা।

ডকুমেন্টেশন থেকে: https://urllib3.readthedocs.org/en/latest/security.html#disabling- সতর্কতা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.