2012-09-18 5 views
6

से उन्हें हटाए बिना लॉगिंग स्टेटमेंट को कैसे बंद करें यदि लॉगिंग स्टेटमेंट्स को कोडबेस में फैलाया जाता है, तो मैं लॉगर कैसे सेट करूं ताकि कोड को तैनात करते समय मुझे प्रत्येक कॉल को लॉगर पर टिप्पणी करने की आवश्यकता न हो उत्पादन में?कोड

import logging 


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d %H:%M') 

logging.debug('debug failed') 
logging.info('info failed') 
logging.warning('A warning') 
+1

क्या यह मूल लॉगिंग 101 नहीं है? – delnan

+2

@ डेलमैन: यदि 101 है तो कृपया एक सर्वोत्तम अभ्यास उत्तर लिखें – Merlin

+0

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

उत्तर

1

प्रवेश के स्तर के होते हैं:

यहाँ मेरे वर्तमान कोड है। लॉगिंग स्तर की गंभीरता के आधार पर, यह इसे प्रिंट करेगा।

Level Numeric value 
CRITICAL 50 
ERROR 40 
WARNING  30 
INFO 20 
DEBUG 10 
NOTSET 0 

लॉगिंग स्तर यह बयान प्रिंट होगा के आधार पर।

आपके द्वारा यहां निर्दिष्ट स्तर स्तर = logging.DEBUG है। तो सभी लॉगिंग स्तरों को याद नहीं करते हैं, प्रिंट आउट करना चाहिए। आप केवल महत्वपूर्ण स्तरों बाहर प्रिंट करना चाहते हैं, तो कृपया स्तर को बदलने = logging.CRITICAL

http://docs.python.org/release/2.5/lib/module-logging.html

3

basicConfig उपयोग करने के बजाय अधिक जानकारी है, तो आप लकड़हारा और अधिक स्पष्ट रूप संचालकों आप चाहते हैं के साथ सेट कर सकते हैं , किसी भी मानदंड के आधार पर।

import logging 

log = logging.getLogger("FOO") 
log.setLevel(logging.DEBUG) 

# needs a handler 
log.info('info') 
#No handlers could be found for logger "FOO" 

ch = logging.StreamHandler() 
log.addHandler(ch) 
log.info('info') 
# info 

log.removeHandler(ch) 

noop = logging.NullHandler() 
log.addHandler(noop) 
# nothing happens here 
log.info('info') 

आप एक सशर्त बयान है कि या तो हैंडलर अगर आप चाहते हैं आप डिबग मोड में चल रहे हैं कहते हैं हो सकता है, या आप एक NullHandler कि सिर्फ लॉग संदेशों को अवशोषित कर लेता जोड़ सकते हैं। आप प्रत्येक हैंडलर के अलग-अलग स्तरों को भी कॉन्फ़िगर कर सकते हैं, ताकि आप हमेशा चेतावनियां और ऊपर देखेंगे। मुख्य लॉगर के अलावा प्रत्येक हैंडलर का अपना स्तर हो सकता है।

आप refer to the tutorials स्तर, हैंडलर और स्वरूपण के साथ अधिक विशिष्ट कैसे प्राप्त कर सकते हैं इस पर आप refer to the tutorials कर सकते हैं।

+0

मैं आपका बिंदु देखता हूं, असली सवाल: चेतावनी के लिए फ़िल्टर सेट कर सकते हैं, और चेतावनी को ब्लैकहोल में जाना है।जब फ़ाइल को डंप करने की आवश्यकता होती है तो शायद नलहैंडलर के साथ खेलना। – Merlin

+0

बुनियादी कॉन्फिग और सेटिंग स्तर '99' के साथ बजाना, काम करना प्रतीत होता था। फ़ाइल बनाई गई, कंसोल या फ़ाइल के लिए कोई प्रिंट नहीं। – Merlin

+0

आप स्क्रिप्ट में झंडे के आधार पर विभिन्न हैंडलर जोड़ सकते हैं। यदि आप इसे डीबग ध्वज के साथ चलाते हैं तो आप इसे एक फ़ाइल हैंडलर जोड़ सकते हैं। अन्यथा आप एक नल हैंडलर जोड़ते हैं। और आप कई हैंडलर जोड़ सकते हैं। हो सकता है कि एक स्ट्रीमहैंडलर चेतावनी को सेट करता है हमेशा चेतावनी या अधिक प्रिंट करता है, और फिर वैकल्पिक फ़ाइल हैंडलर आपके सभी डीबग स्तरों को पकड़ने के लिए डीबग करने के लिए सेट होता है। स्तर को 99 तक सेट करने से यह इतना ऊंचा हो जाता है कि कोई लॉग स्तर इसका मिलान नहीं करेगा। यह वास्तव में एक आम तरीका नहीं है। – jdi

1

यहां कुछ वास्तव में सरल उत्तर दिए गए हैं। सबसे पहले basicConfig(...) कथन पर टिप्पणी करना है। इसका प्रभाव किसी भी लॉगर्स, हैंडलर या फॉर्मेटर्स को स्थापित नहीं करेगा जिसका अर्थ है कि आपकी डीबग(), जानकारी(), आदि कॉल प्रभावी रूप से नो-ऑप्स होंगे।

एक और सरल जवाब basicConfig() में लॉगिंग स्तर को DEBUG से अधिक कुछ कॉल करने के लिए सेट करना है। CRITICAL + 1 यह सुनिश्चित करेगा कि आप कभी भी लॉग संदेश नहीं देखेंगे।

हालांकि आपने इस कोड को उत्पादन में स्थानांतरित करने के बारे में कुछ बताया है, तो आप शायद -q और -v कमांड लाइन विकल्प प्रदान करते हैं (माना जाता है कि यह एक सीएलआई उपकरण है)। मेरा सामान्य दृष्टिकोण WARNING स्तर पर शुरू करना है, और प्रत्येक -q फ़िल्टर स्तर को बढ़ाकर शांत लॉगिंग की ओर बढ़ना है। इसके विपरीत, प्रत्येक -v के लिए, अधिक वर्बोज़ लॉगिंग की ओर बढ़ें। यहां कोड का एक स्निपेट है जो वास्तव में करता है।

from argparse import ArgumentParser 
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG 

parser = ArgumentParser() 
parser.add_argument("-v", "--verbose", action="count") 
parser.add_argument("-q", "--quiet", action="count") 

arguments = parser.parse_args() 

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0) 
if raw_log_level <= 0: 
    log_level = CRITICAL 
elif raw_log_level == 1: 
    log_level = ERROR 
elif raw_log_level == 2:  # default 
    log_level = WARNING 
elif raw_log_level == 3: 
    log_level = INFO 
else:   
    log_level = DEBUG 

basicConfig(level=log_level)