2010-02-15 12 views
95

मैं पाइथन logging मॉड्यूल का उपयोग कर रहा हूं और मैं कुछ समय के लिए कंसोल लॉगिंग को अक्षम करना चाहता हूं लेकिन यह काम नहीं करता है।पायथन में कंसोल लॉगिंग को अक्षम और पुनः सक्षम कैसे करें?


    #!/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 logging.handlers 
    # this will print [<logging.StreamHandler instance at ...>] 
    # but I may have other handlers there that I want to keep 

    logger.debug("bla bla") 

ऊपर कोड stdout पर प्रदर्शित करता है "bla bla" और मैं नहीं जानता कि कैसे मैं सुरक्षित रूप से सांत्वना हैंडलर अक्षम कर सकते हैं। मैं कैसे सुनिश्चित कर सकता हूं कि मैं अस्थायी रूप से कंसोल स्ट्रीमहैंडर को हटा दूं और दूसरा नहीं?

उत्तर

140

मैं इस के लिए एक समाधान मिल गया।

+0

यह पायथन 3.5 के लिए काम करता है। धन्यवाद! –

+1

मुझे नहीं लगता कि यह एक अच्छा समाधान है। उच्च लॉगर्स के प्रचार में अन्य अवांछित परिणाम हो सकते हैं। – lfk

+1

यदि आप केवल एक निश्चित लॉग स्तर के नीचे संदेश फ़िल्टर करना चाहते हैं (कहें, सभी 'INFO' संदेश), तो आप दूसरी पंक्ति को' logger.setLevel (logging.WARNING) ' –

2

मुझे लॉगिंग मॉड्यूल बहुत अच्छी तरह से नहीं पता है, लेकिन मैं इसका उपयोग इस तरीके से कर रहा हूं कि मैं आमतौर पर केवल डीबग (या जानकारी) संदेशों को अक्षम करना चाहता हूं। लॉगिंग स्तर को CRITICAL या उच्चतर पर सेट करने के लिए आप Handler.setLevel() का उपयोग कर सकते हैं।

इसके अलावा, आप लिखने के लिए खुली फ़ाइल द्वारा sys.stderr और sys.stdout को प्रतिस्थापित कर सकते हैं। http://docs.python.org/library/sys.html#sys.stdout देखें। लेकिन मैं इसकी सिफारिश नहीं करता।

+0

यह काम कर सकता है अगर logger.handlers में कुछ शामिल होगा, वर्तमान में '[]' है। – sorin

8

stdout को हटाने की कोई आवश्यकता नहीं है।

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

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

एक भी सरल तरीका है::

logging.getLogger().setLevel(100) 
+1

पायथन 2.7+ में यह [NullHandler()] (https://docs.python.org/2/library/logging.handlers के रूप में उपलब्ध है।एचटीएमएल # nullhandler) – Pierre

52

आप उपयोग कर सकते: यहाँ यह करने के लिए बेहतर तरीका है

logging.basicConfig(level=your_level) 

जहां your_level उन में से एक है:

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

इसलिए, यदि आप logging.CRITICALको your_level निर्धारित करते हैं, आपके द्वारा भेजी गई केवल महत्वपूर्ण संदेश प्राप्त होगा:

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

logging.DEBUG को your_level स्थापना प्रवेश के सभी स्तरों पर दिखाई देगा।

अधिक जानकारी के लिए, कृपया logging examples.

पर एक नज़र डालें इसी तरह Handler.setLevel() फ़ंक्शन का उपयोग प्रत्येक हैंडलर के लिए स्तर बदलने के लिए।

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

यह ऊपरी लकड़हारा कि कंसोल लॉगिंग शामिल करने के लिए भेजने के होने से प्रवेश नहीं कर पाएगा:

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) 
+1

यह आम तौर पर उपयोगी जानकारी है, लेकिन सवाल पूछा गया कि कैसे एक अतिरिक्त हैंडलर जोड़ने के लिए कंसोल लॉगिंग अक्षम करें। यदि आप मूल उदाहरण पर लागू उपरोक्त कोड के साथ my_logger.handlers की जांच कर रहे थे, तो आप दो हैंडलर देखेंगे - आपकी नई फ़ाइल हैंडलर और मूल स्ट्रीम हैंडलर। – Joe

59

मैं का उपयोग करें:

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

जैसे कुछ बदल सकते हैं, यह' लॉगिंग 'पर भी काम करता है 'लॉगिंग अक्षम करने के लिए मॉड्यूल स्तर * पूरी तरह से *, उदाहरण के लिए:' आयात लॉगिंग; logging.disable (logging.CRITICAL); ': https://docs.python.org/2/library/logging.html#logging.disable – lsh

35

(लंबे समय तक मृत सवाल, लेकिन भविष्य खोजकर्ताओं के लिए)

मूल पोस्टर के कोड/आशय के करीब, इस अजगर 2 के अंतर्गत मेरे लिए काम करता है।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") 

पकड़ लिया मैं बाहर काम करने के लिए किया था एक नया जोड़ने के बाद stdout हैंडलर दूर करने के लिए किया गया था; यदि कोई हैंडलर मौजूद नहीं है तो लॉगर कोड स्वचालित रूप से stdout को फिर से जोड़ना प्रतीत होता है।

+2

सहमत हैं। यह सही जवाब है। – obsoleter

25

यहां कुछ वाकई अच्छे जवाब दिए गए हैं, लेकिन स्पष्ट रूप से सरलतम को ध्यान में नहीं लिया जाता है (केवल इन्फिनिटो से)।

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

यह रूट लॉगर, और इस प्रकार अन्य सभी लॉगर्स को अक्षम करता है। मैंने वास्तव में परीक्षण नहीं किया है लेकिन यह भी सबसे तेज़ होना चाहिए।

प्रवेश कोड अजगर 2.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) 

जिसका मतलब है कि जब यह अक्षम होता है कोई हैंडलर कहा जाता है, और यह एक बहुत ही उच्च मूल्य के लिए छानने या नहीं- स्थापित करने कि और अधिक कुशल होना चाहिए से उदाहरण के लिए ओप हैंडलर।

+0

रूट लॉगर प्राप्त करने से मेरी समस्या हल हो गई। धन्यवाद – cgl

+1

यह सवाल का सबसे अच्छा जवाब है। – user1823280

+1

जब तक कि मैं कुछ गलत नहीं कर रहा हूं, यह केवल रूट लॉगर को अक्षम करता है और कोई भी 'log = logging.getLogger (__ name __) ' – starfry

28

प्रसंग प्रबंधक

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() 
+0

मुझे वास्तव में यह मुहावरे पसंद है, लेकिन मैं एक विशेष नामस्थान को अक्षम करने में सक्षम हूं। उदाहरण के लिए, मैं बस रूट लॉगर अस्थायी रूप से अक्षम करना चाहता हूं। हालांकि इस मुहावरे का उपयोग करते हुए, हम केवल अस्थायी रूप से हैंडलर को जोड़ने/हटाने में सक्षम होना चाहिए। – Chris

2

तुम भी किए जा सकेंगे:

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

को पूर्णतः अक्षम करने लॉगिंग:

logging.disable(sys.maxint) 

प्रवेश सक्षम करने के लिए:

logging.disable(logging.NOTSET) 

अन्य उत्तर प्रदान काम arounds, इस तरह के

logging.getLogger().disabled = True 

और की तुलना में कुछ n अधिक से अधिक के लिए, के रूप में जो पूरी तरह से समस्या का समाधान नहीं है 50,

logging.disable(n) 

पहले समाधान के साथ समस्या यह है कि यह केवल रूट लॉगर के लिए काम करता है। उपयोग करके बनाए गए अन्य लॉगर्स, logging.getLogger(__name__) इस विधि से अक्षम नहीं हैं।

दूसरा समाधान सभी लॉग को प्रभावित करता है। लेकिन यह है कि ऊपर के स्तर को देखते हुए करने के लिए उत्पादन को सीमित करता है, तो एक एक स्तर के साथ प्रवेश करके यह रद्द कर सकते थे एक से अधिक 50.

समीक्षा करने के बाद से

logging.disable(sys.maxint) 

जो जहाँ तक मैं बता सकता हूँ (रोका जा सकता है कि source) लॉगिंग को पूरी तरह अक्षम करने का एकमात्र तरीका है।

संबंधित मुद्दे