পাইথনে কনসোল লগিং কীভাবে অক্ষম ও পুনরায় সক্ষম করবেন?


153

আমি পাইথনের লগিং মডিউলটি ব্যবহার করছি এবং আমি কিছু সময়ের জন্য কনসোল লগিংটি অক্ষম করতে চাই তবে এটি কার্যকর হয় না।

#!/usr/bin/python
import logging

logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers 
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)

print logger.handlers 
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep

logger.debug("bla bla")

উপরের কোডটি bla blaস্ট্যান্ডআউটটি প্রদর্শন করে এবং আমি জানি না কীভাবে আমি কনসোল হ্যান্ডলারটি নিরাপদে অক্ষম করতে পারি। আমি কীভাবে নিশ্চিত হতে পারি যে আমি সাময়িকভাবে কনসোল স্ট্রিমহ্যান্ডলারটি সরিয়েছি অন্যটি নয়?


যারা ভাবছেন যে কেন লগিং নিষ্ক্রিয় করতে চান: আপনি পাসওয়ার্ড বা এপিআই কীগুলির মতো ব্যক্তিগত ডেটা লগ করতে চান না।
স্টিভোসিয়াক

4
@StevenVascellaro। তখন কেন প্রথমে লগারে পাঠানো হচ্ছে? এটি ঠিক শোনাচ্ছে না ...
ম্যাড পদার্থবিদ

1
@ ম্যাডফিসিসিস্ট আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা এক্সএমএল অনুরোধগুলি একটি বাহ্যিক এপিআইতে প্রেরণ করে। ডিফল্টরূপে, এই অনুরোধগুলি একটি ফাইলে লগ হয়। তবে, প্রাথমিক লগইনটির একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ প্রমাণীকরণ প্রয়োজন, যা আমি লগ করতে চাই না।
স্টিভয়েসিয়াক

@StevenVascellaro। আমি দেখি. ব্যাখ্যার জন্য ধন্যবাদ.
ম্যাড পদার্থবিদ

আপনি কীভাবে / কোথায় আপনার হ্যান্ডলারগুলি যুক্ত করবেন তা আপনি প্রদর্শন করবেন না। যদি সেগুলি রুট লগারে যুক্ত করা হয় তবে এটি ডকস.পাইথন.অর্গ / ৩ / লিবারি / ব্লগিং এইচটিএমএল#logging.basicConfig এ বর্ণিত ডিফল্ট স্ট্রিমহ্যান্ডলার যুক্ত হওয়া থেকে লগিং রোধ করবে linked ডিফল্ট স্ট্রিমহ্যান্ডলারটি কেবল প্রথম সময়ে যুক্ত করা হবে কল নির্গমনকারী লগ বার্তা যাতে আপনি মুদ্রণ করবেন logger.handlersএটি ফাঁকা হওয়া উচিত (এটি logger.debug()কল করার আগে যেমন হয়েছিল )। প্রশ্নযুক্ত কোডটি কেবল [](হ্যান্ডলারের খালি তালিকা) প্রদর্শন করে। পাইথন 2.7.15 এবং পাইথন 3.6.6 দিয়ে যাচাই করা হয়েছে।
পাইটর ডব্রোগোস্ট

উত্তর:


197

আমি এর জন্য একটি সমাধান পেয়েছি:

logger = logging.getLogger('my-logger')
logger.propagate = False
# now if you use logger it will not log to console.

এটি লগিংকে উপরের লগারে কনসোল লগিং অন্তর্ভুক্ত পাঠানো থেকে আটকাবে।


8
আমি মনে করি না এটি একটি ভাল সমাধান। উচ্চতর লগারে প্রচার না করা অন্যান্য অনাকাঙ্ক্ষিত পরিণতি হতে পারে।
lfk

2
যদি আপনি কেবলমাত্র নির্দিষ্ট লগ স্তরের নীচে বার্তা ফিল্টার করতে চান (সমস্ত INFOবার্তা বলুন), আপনি দ্বিতীয় লাইনের মতো কিছুতে পরিবর্তন করতে পারেনlogger.setLevel(logging.WARNING)
হার্টলে ব্রোডি

2
এরপরে আপনি লগটি কীভাবে সক্ষম করবেন?
স্টিভয়েসিয়াক

4
অবরুদ্ধ প্রচারকে কোনও উত্তর কার্যকরভাবে কার্যকরভাবে রুট লগারের সমস্ত হ্যান্ডলারকে অক্ষম করে না এবং প্রশ্নটি পরিষ্কারভাবে বলে দেয় (…) তবে আমার সেখানে অন্যান্য হ্যান্ডলার থাকতে পারে যা আমি রাখতে চাই যা উদ্দেশ্যটি কেবলমাত্র রুট লগারের ডিফল্ট স্ট্রিমহ্যান্ডলারটি অক্ষম করা ।
পাইটর ডব্রোগোস্ট

বার্তার প্রচার বন্ধ করা যথেষ্ট নয়। পাইথন 3.2 যেহেতু , logging.lastResortহ্যান্ডলার এখনও তীব্রতা বার্তা লগ ইন করুন করবে logging.WARNINGও বৃহত্তর করার sys.stderrঅন্যান্য হ্যান্ডেলার অভাবে। আমার উত্তর দেখুন
ম্যাগগিরো

106

আমি ব্যবহার করি:

logger = logging.getLogger()
logger.disabled = True
... whatever you want ...
logger.disabled = False

9
এটি সম্পূর্ণরূপেlogging লগিং নিষ্ক্রিয় করতে মডিউল স্তরেও কাজ করে , উদাহরণস্বরূপ :: docs.python.org/2/library/logging.html#logging.disableimport logging; logging.disable(logging.CRITICAL);
lsh

1
এটি প্রচারকে অক্ষম করার চেয়ে অনেক ভাল।
মাটরে মার্ক

6
কোনও উত্তর নয় - প্রশ্নটি কীভাবে কেবল ডিফল্ট স্ট্রিমহ্যান্ডলারটি অক্ষম করতে হয় ।
পাইটর ডব্রোগোস্ট

1
disabledঅ্যাট্রিবিউট পাবলিক API- এর অংশ নয়। Bugs.python.org/issue36318 দেখুন ।
ম্যাগগিরো

69

তুমি ব্যবহার করতে পার:

logging.basicConfig(level=your_level)

যেখানে আপনার_সামগ্রী এর মধ্যে একটি:

      'debug': logging.DEBUG,
      'info': logging.INFO,
      'warning': logging.WARNING,
      'error': logging.ERROR,
      'critical': logging.CRITICAL

সুতরাং, যদি আপনি নির্ধারণ your_level করার logging.CRITICAL , আপনি পাঠানো শুধুমাত্র সমালোচনামূলক বার্তা পাবেন:

logging.critical('This is a critical error message')

আপনার লেভেলটিকে লগিংয়ে সেট করা DE DEBUG লগিংয়ের সমস্ত স্তর প্রদর্শন করবে।

আরও বিশদের জন্য দয়া করে লগিংয়ের উদাহরণগুলি একবার দেখুন

প্রতিটি হ্যান্ডলারের জন্য স্তর পরিবর্তন করতে একই পদ্ধতিতে Handler.setLevel () ফাংশন ব্যবহার করুন ।

import logging
import logging.handlers

LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
          LOG_FILENAME, maxBytes=20, backupCount=5)

handler.setLevel(logging.CRITICAL)

my_logger.addHandler(handler)

6
এটি সাধারণত দরকারী তথ্য, তবে প্রশ্নটি কীভাবে কনসোল লগিং নিষ্ক্রিয় করবেন, অতিরিক্ত হ্যান্ডলার যোগ করার উপায়টি নয় asked যদি আপনি উপরোক্ত কোডটির সাথে my_logger.handlers পরীক্ষা করে দেখেন মূল উদাহরণটিতে প্রয়োগ করা হয়, আপনি দুটি হ্যান্ডলার দেখতে পাবেন - আপনার নতুন ফাইল হ্যান্ডলার এবং মূল স্ট্রিম হ্যান্ডলার।
জো

ক্রিটিকাল ছিল সেই শব্দটি যা আমি খুঁজছিলাম। ধন্যবাদ।
নিশান্ত

আমি অফের একটি ডিবাগ স্তর দেখতে পছন্দ করব। এটি দ্ব্যর্থহীন এবং সহজ।
কোনও মেশিন নেই

46

(দীর্ঘ মৃত প্রশ্ন, তবে ভবিষ্যত অনুসন্ধানকারীদের জন্য)

মূল পোস্টারের কোড / অভিপ্রায় নিকটে, এটি পাইথন ২.6 এর অধীনে আমার পক্ষে কাজ করে

#!/usr/bin/python
import logging

logger = logging.getLogger() # this gets the root logger

lhStdout = logger.handlers[0]  # stdout is the only handler initially

# ... here I add my own handlers 
f = open("/tmp/debug","w")          # example handler
lh = logging.StreamHandler(f)
logger.addHandler(lh)

logger.removeHandler(lhStdout)

logger.debug("bla bla")

আমার যে কাজটি করাতে হয়েছিল তা হ'ল একটি নতুন যুক্ত করার পরে স্টাটআউট হ্যান্ডলারটি সরিয়ে ফেলা ; লগার কোডটি কোনও হ্যান্ডলার উপস্থিত না থাকলে স্বয়ংক্রিয়ভাবে স্টডআউটটিকে পুনরায় যুক্ত করতে প্রদর্শিত হবে।


2
logger = logging.getLogger(); lhStdout = logger.handlers[0]প্রাথমিকভাবে রুট লগার কোনও হ্যান্ডলার নেই বলে ক্রমটি ভুল python -c "import logging; assert not logging.getLogger().handlers"। পাইথন 2.7.15 এবং পাইথন 3.6.6 দিয়ে যাচাই করা হয়েছে।
পাইওটর ডব্রোগোস্ট

42

প্রসঙ্গ পরিচালক

import logging 
class DisableLogger():
    def __enter__(self):
       logging.disable(logging.CRITICAL)
    def __exit__(self, a, b, c):
       logging.disable(logging.NOTSET)

ব্যবহারের উদাহরণ:

with DisableLogger():
    do_something()

আমি এই আইডিয়ামটি সত্যই পছন্দ করি তবে আমি বরং কোনও নির্দিষ্ট নামস্থান অক্ষম করতে সক্ষম হব। উদাহরণস্বরূপ, আমি কেবলমাত্র রুট লগারটি সাময়িকভাবে অক্ষম করতে চাই। যদিও এই প্রতিমাটি ব্যবহার করা হচ্ছে, আমাদের সাময়িকভাবে হ্যান্ডলারগুলি এবং এগুলি যুক্ত করতে / মুছতে সক্ষম হওয়া উচিত।
ক্রিস

1
প্রশ্ন হল কিভাবে নিষ্ক্রিয় ডিফল্ট StreamHandler অনুরোধ শুধুমাত্র
পাইওটার ডব্রোগোস্ট

1
আপনার নিজের ক্লাস রোল করার দরকার নেই, আপনি কনটেক্সলিব থেকে @ কনটেক্সটম্যানার ব্যবহার করতে এবং একটি ফলনকারী ফাংশন লিখতে পারেন
ক্রিশ্চিয়ানআর

আপনি যদি আপনার পিজ্জাতে বিদেশী ফলের মধ্যে থাকেন। অবশ্যই।
ব্যবহারকারী3504575

34

লগিং সম্পূর্ণরূপে অক্ষম করতে :

logging.disable(sys.maxint) # Python 2

logging.disable(sys.maxsize) # Python 3

লগিং সক্ষম করতে :

logging.disable(logging.NOTSET)

অন্যান্য উত্তরগুলি চারপাশে কাজ সরবরাহ করে যা সমস্যার সম্পূর্ণ সমাধান করে না, যেমন

logging.getLogger().disabled = True

এবং, n50 এরও বেশি কিছুতে

logging.disable(n)

প্রথম সমাধানের সাথে সমস্যাটি হ'ল এটি কেবল রুট লগারের জন্যই কাজ করে। ব্যবহার করে তৈরি অন্যান্য লগারগুলি logging.getLogger(__name__)এই পদ্ধতি দ্বারা অক্ষম নয়।

দ্বিতীয় সমাধানটি সমস্ত লগগুলিকে প্রভাবিত করে। তবে এটি আউটপুটটিকে প্রদত্ত স্তরের উপরে সীমাবদ্ধ করে, তাই 50 এর চেয়ে বেশি স্তর নিয়ে লগ ইন করে কেউ এটিকে ওভাররাইড করতে পারে।

যে দ্বারা প্রতিরোধ করা যেতে পারে

logging.disable(sys.maxint)

যা আমি যতদূর বলতে পারি ( উত্স পর্যালোচনা করার পরে ) লগিং সম্পূর্ণরূপে অক্ষম করার একমাত্র উপায়।


1
ডাউনওয়েট প্রশ্নটি জিজ্ঞাসা করে যে কীভাবে কেবল
পাইওটর ডব্রোগস্ট

27

এখানে কিছু দুর্দান্ত উত্তর রয়েছে, তবে দৃশ্যত সরলতমগুলি খুব বেশি বিবেচনায় নেওয়া হয় না (কেবল ইনফিনিটো থেকে)।

root_logger = logging.getLogger()
root_logger.disabled = True

এটি রুট লগার এবং এইভাবে অন্যান্য সমস্ত লগার অক্ষম করে। আমি সত্যিই পরীক্ষা করিনি তবে এটিও দ্রুত হওয়া উচিত।

পাইথন ২.7 এ লগিং কোড থেকে আমি এটি দেখতে পাচ্ছি

def handle(self, record):
    """
    Call the handlers for the specified record.

    This method is used for unpickled records received from a socket, as
    well as those created locally. Logger-level filtering is applied.
    """
    if (not self.disabled) and self.filter(record):
        self.callHandlers(record)

যার অর্থ হ'ল এটি যখন অক্ষম থাকে তখন কোনও হ্যান্ডলারকে ডাকা হয় না এবং এটি আরও কার্যকর হওয়া উচিত যে খুব উচ্চ মানের কাছে ফিল্টারিং করা বা উদাহরণস্বরূপ কোনও অপ-হ্যান্ডলার সেট করা।


1
আমি যদি কোনও ভুল না করে থাকি তবে এটি কেবলমাত্র রুট লগারকে অক্ষম করে এবং এমন কোনও তৈরি করে নাlog = logging.getLogger(__name__)
স্টারফ্রাই

2
আপনি যদি একাধিক লগার বা একাধিক হ্যান্ডলারের সাথে ডিল করেন তবে এটি সমস্যাযুক্ত হতে পারে। উদাহরণস্বরূপ, যদি আপনি এখনও কোনও ফাইলে লগ করতে চান তবে নির্দিষ্ট ক্ষেত্রে স্ট্রিম হ্যান্ডলারটি অক্ষম করতে চান।
জো

1
এটি রুট লগার অক্ষম করে এবং এইভাবে অন্যান্য সমস্ত লগার - কঠোরভাবে বলতে গেলে রুট লগার অক্ষম করা অন্য কোনও লগার অক্ষম করে না। ডিফল্ট স্ট্রিমহ্যান্ডলারটি কেবলমাত্র অক্ষম করার বিষয়ে প্রশ্নটি জিজ্ঞাসা করে ।
পাইওটার ডব্রোগোস্ট

disabledঅ্যাট্রিবিউট পাবলিক API- এর অংশ নয়। Bugs.python.org/issue36318 দেখুন ।
ম্যাগগিরো

10

স্টডআউট ডাইভার্ট করার দরকার নেই। এটি করার আরও ভাল উপায় এখানে:

import logging
class MyLogHandler(logging.Handler):
    def emit(self, record):
        pass

logging.getLogger().addHandler(MyLogHandler())

একটি এমনকি সহজ উপায় হ'ল:

logging.getLogger().setLevel(100)

4
পাইথন সালে 2.7+ এই হিসাবে পাওয়া যায় NullHandler ()
পিয়ের

1
logging.basicConfig()ফাংশন (জোর দেওয়া খনি) এর বিবরণ পড়ার পরে এটি কেন কাজ করে (ডিফল্ট স্ট্রিমহ্যান্ডলারকে অক্ষম করে) তার কারণ দেখা যায় : ডিফল্ট ফর্ম্যাটর সহ একটি স্ট্রিমহ্যান্ডলার তৈরি করে এবং এটি রুট লগারে যুক্ত করে লগিং সিস্টেমের জন্য বেসিক কনফিগারেশনটি করে? ফাংশনগুলি ডিবাগ (), তথ্য (), সতর্কতা (), ত্রুটি () এবং সমালোচনামূলক () বেসলকনফিগ () কে স্বয়ংক্রিয়ভাবে কল করবে যদি কোনও রুট লগারের জন্য কোনও হ্যান্ডলার সংজ্ঞায়িত না হয়- docs.python.org/3/library/logging.html#logging.basicConfig
পাইওটর ডব্রোগোস্ট

2

আমি লগিং মডিউলটি খুব ভাল জানি না তবে আমি সাধারণত এটির মাধ্যমে কেবলমাত্র ডিবাগ (বা তথ্য) বার্তাগুলি অক্ষম করতে চাই। আপনি Handler.setLevel()লগিং স্তরটি CRITICAL বা উচ্চতরতে সেট করতে ব্যবহার করতে পারেন ।

এছাড়াও, আপনি লেখার জন্য খোলা ফাইল দ্বারা sys.stderr এবং sys.stdout প্রতিস্থাপন করতে পারেন। Http://docs.python.org/library/sys.html#sys দেখুন stdout । তবে আমি এটি সুপারিশ করব না।


এটি কাজ করতে পারে যদি লগার.হ্যান্ডারগুলিতে এমন কিছু থাকবে যা বর্তমানে রয়েছে []
sorin

2

আপনিও করতে পারেন:

handlers = app.logger.handlers
# detach console handler
app.logger.handlers = []
# attach
app.logger.handlers = handlers

আপনি কেন এমন ব্যবহার করছেন app.loggerযা আপনি প্রশ্ন ( logging.getLogger()) এবং বেশিরভাগ উত্তরে স্পষ্টভাবে উল্লিখিত রুট লগারের পরিবর্তে নির্দিষ্ট করে নেই ? আপনি কীভাবে জানবেন যে আপনি handlersকল করার Logger.addHandlerপদ্ধতির পরিবর্তে সম্পত্তিটি নিরাপদে পরিবর্তন করতে পারবেন ?
পাইওটার ডব্রোগোস্ট

2
import logging

log_file = 'test.log'
info_format = '%(asctime)s - %(levelname)s - %(message)s'
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'info_format': {
            'format': info_format
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'info_format'
        },
        'info_log_file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'level': 'INFO',
            'filename': log_file,
            'formatter': 'info_format'
        }
    },
    'loggers': {
        '': {
            'handlers': [
                'console',
                'info_log_file'
            ],
            'level': 'INFO'
        }
    }
})


class A:

    def __init__(self):
        logging.info('object created of class A')

        self.logger = logging.getLogger()
        self.console_handler = None

    def say(self, word):
        logging.info('A object says: {}'.format(word))

    def disable_console_log(self):
        if self.console_handler is not None:
            # Console log has already been disabled
            return

        for handler in self.logger.handlers:
            if type(handler) is logging.StreamHandler:
                self.console_handler = handler
                self.logger.removeHandler(handler)

    def enable_console_log(self):
        if self.console_handler is None:
            # Console log has already been enabled
            return

        self.logger.addHandler(self.console_handler)
        self.console_handler = None


if __name__ == '__main__':
    a = A()
    a.say('111')
    a.disable_console_log()
    a.say('222')
    a.enable_console_log()
    a.say('333')

কনসোল আউটপুট:

2018-09-15 15:22:23,354 - INFO - object created of class A
2018-09-15 15:22:23,356 - INFO - A object says: 111
2018-09-15 15:22:23,358 - INFO - A object says: 333

টেস্ট.লগ ফাইল সামগ্রী:

2018-09-15 15:22:23,354 - INFO - object created of class A
2018-09-15 15:22:23,356 - INFO - A object says: 111
2018-09-15 15:22:23,357 - INFO - A object says: 222
2018-09-15 15:22:23,358 - INFO - A object says: 333

2
কোড সম্পর্কে কিছু বিবরণ যুক্ত করুন। এটি আরও ভালভাবে সহায়তা করবে
ম্যাথিউস সানি

2

"Logging.config.dictConfig" এ একটি স্তর পরিবর্তন করে আপনি পুরো লগিং স্তরটিকে একটি নতুন স্তরে নিয়ে যেতে সক্ষম হবেন।

logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'console': {
        'format': '%(name)-12s %(levelname)-8s %(message)s'
    },
    'file': {
        'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
    }
},
'handlers': {
    'console': {
        'class': 'logging.StreamHandler',
        'formatter': 'console'
    },
#CHANGE below level from DEBUG to THE_LEVEL_YOU_WANT_TO_SWITCH_FOR
#if we jump from DEBUG to INFO
# we won't be able to see the DEBUG logs in our logging.log file
    'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'formatter': 'file',
        'filename': 'logging.log'
    },
},
'loggers': {
    '': {
        'level': 'DEBUG',
        'handlers': ['console', 'file'],
        'propagate': False,
    },
}

})


1

সজ্জা ব্যবহার করে একটি মার্জিত সমাধান পেয়েছেন , যা নিম্নলিখিত সমস্যার সমাধান করে : আপনি যদি একাধিক ফাংশন নিয়ে মডিউল লিখছেন, তাদের মধ্যে বেশ কয়েকটি ডিবাগিং বার্তা রয়েছে এবং আপনি বর্তমানে সমস্ত ফাংশনে লগিং নিষ্ক্রিয় করতে চান তবে আপনি বর্তমানে ফোকাস করছেন?

আপনি এটি সজ্জকার ব্যবহার করে করতে পারেন:

import logging, sys
logger = logging.getLogger()
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)


def disable_debug_messages(func):
    def wrapper(*args, **kwargs):
        prev_state = logger.disabled
        logger.disabled = True
        result = func(*args, **kwargs)
        logger.disabled = prev_state
        return result
    return wrapper

তারপরে, আপনি এটি করতে পারেন:

@disable_debug_messages
def function_already_debugged():
    ...
    logger.debug("This message won't be showed because of the decorator")
    ...

def function_being_focused():
    ...
    logger.debug("This message will be showed")
    ...

এমনকি যদি আপনি function_already_debuggedভেতর থেকে কল করেন তবে এর থেকে function_being_focusedডিবাগ বার্তাগুলি প্রদর্শিত function_already_debuggedহবে না। এটি নিশ্চিত করে যে আপনি যে ফাংশনটিতে ফোকাস করছেন সেখান থেকে আপনি কেবলমাত্র ডিবাগ বার্তাগুলি দেখতে পাবেন।

আশা করি এটা সাহায্য করবে!


0

আপনি যদি একটি নির্দিষ্ট লগার সাময়িকভাবে অক্ষম করতে চান তবে এখানে যা করা হয়েছে তা এখানে।

উদাহরণ লগ

2019-10-02 21:28:45,663 django.request PID: 8  Internal Server Error: /service_portal/get_all_sites

কোড

django_request_logger = logging.getLogger('django.request')
django_request_logger.disabled = True
django_request_logger.disabled = False

0

লগিং পাইথন লাইব্রেরিতে, একটি নির্দিষ্ট লগারের জন্য নিম্নলিখিতগুলির যে কোনও একটি দ্বারা সম্পূর্ণরূপে লগিং ( সমস্ত স্তরের জন্য) অক্ষম করা যায় :

  1. লগারে কোনও logging.NullHandler()হ্যান্ডলার যুক্ত করা ( logging.lastResortহ্যান্ডলারটিকে তীব্রতার লগিং ইভেন্টগুলি logging.WARNINGবা তার চেয়ে বড়তর ঘটনাকে প্রতিরোধ করতে sys.stderr) এবং সেই লগারের বৈশিষ্ট্যটি সেট propagateকরাFalse (লগারটিকে পূর্বপুরুষের লগারের হ্যান্ডলারের কাছে ইভেন্টগুলি পাস হতে আটকাতে)।

    • প্রধান এপিআই ব্যবহার করে:

      import logging
      
      logging.getLogger("foo").addHandler(logging.NullHandler())
      logging.getLogger("foo").propagate = False
    • কনফিগার এপিআই ব্যবহার করে:

      import logging.config
      
      logging.config.dictConfig({
          "version": 1,
          "handlers": {
              "null": {
                  "class": "logging.NullHandler"
              }
          },
          "loggers": {
              "foo": {
                  "handlers": ["null"],
                  "propagate": False
              }
          }
      })
  2. লগারে একটি lambda record: Falseফিল্টার যুক্ত করা হচ্ছে ।

    • প্রধান এপিআই ব্যবহার করে:

      import logging
      
      logging.getLogger("foo").addFilter(lambda record: False)
    • কনফিগার এপিআই ব্যবহার করে:

      import logging.config
      
      logging.config.dictConfig({
          "version": 1,
          "filters": {
              "all": {
                  "()": lambda: (lambda record: False)
              }
          },
          "loggers": {
              "foo": {
                  "filters": ["all"]
              }
          }
      })

সতর্কবাণী। - 1 ম সমাধানের বিপরীতে, দ্বিতীয় সমাধান চাইল্ড লগারদের (যেমন উদাহরণস্বরূপ logging.getLogger("foo.bar")) লগিং নিষ্ক্রিয় করে না , সুতরাং এটি কেবলমাত্র একটি একক লগারের জন্য লগিং অক্ষম করতে ব্যবহার করা উচিত।

বিঃদ্রঃ. - লগারের disabledঅ্যাট্রিবিউটটি সেট করা Trueতৃতীয় সমাধান নয়, কারণ এটি পাবলিক এপিআইয়ের অংশ নয়। Https://bugs.python.org/issue36318 দেখুন :

import logging

logging.getLogger("foo").disabled = True  # DO NOT DO THAT

-1

আপনি সাময়িকভাবে অক্ষম করতে সক্ষম হ্যান্ডলারটি সাবক্লাস করুন:

class ToggledHandler(logging.StreamHandler):
"""A handler one can turn on and off"""

def __init__(self, args, kwargs):
    super(ToggledHandler, self).__init__(*args, **kwargs)
    self.enabled = True  # enabled by default

def enable(self):
    """enables"""
    self.enabled = True

def disable(self):
    """disables"""
    self.enabled = False

def emit(self, record):
    """emits, if enabled"""
    if self.enabled:
        # this is taken from the super's emit, implement your own
        try:
            msg = self.format(record)
            stream = self.stream
            stream.write(msg)
            stream.write(self.terminator)
            self.flush()
        except Exception:
            self.handleError(record)

নামে হ্যান্ডলারটি সন্ধান করা বেশ সহজ:

_handler = [x for x in logging.getLogger('').handlers if x.name == your_handler_name]
if len(_handler) == 1:
    _handler = _handler[0]
else:
    raise Exception('Expected one handler but found {}'.format(len(_handler))

একবার পাওয়া গেছে:

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