2012-05-20 12 views
7

मैं वर्तमान में pyftpdlib मॉड्यूल के 1.0.0 रिलीज पर काम कर रहा हूं। यह नई रिलीज में कुछ पिछड़े असंगत परिवर्तनों को पेश करेगी कि कुछ एपीआई अब बाइट्स को स्वीकार नहीं करेंगे लेकिन यूनिकोड। जबकि मैं इस ब्रेकेज के हिस्से के रूप में हूं, मैं अपने लॉगिंग फ़ंक्शंस से छुटकारा पाने के लिए संभावना पर विचार कर रहा था, जो वर्तमान में प्रिंट स्टेटमेंट का उपयोग करता है, और इसके बजाय लॉगिंग मॉड्यूल का उपयोग करता है।लॉगिंग बनाम प्रिंट() + लॉगिंग के फायदे सर्वोत्तम अभ्यास

के रूप में अभी प्रतिनिधियों 3 कार्यों के लिए प्रवेश pyftpdlib:

def log(s): 
    """Log messages intended for the end user.""" 
    print s 

def logline(s): 
    """Log commands and responses passing through the command channel.""" 
    print s 

def logerror(s): 
    """Log traceback outputs occurring in case of errors.""" 
    print >> sys.stderr, s 

उपयोगकर्ता के लॉग अनुकूलित करने के लिए (उदाहरण के लिए एक फाइल करने के लिए उन्हें लिखना) तैयार है बस के रूप में इन 3 कार्यों के ऊपर लिख करने वाला:

>>> from pyftpdlib import ftpserver 
>>> 
>>> def log2file(s): 
...  open('ftpd.log', 'a').write(s) 
... 
>>> ftpserver.log = ftpserver.logline = ftpserver.logerror = log2file 

अब मैं सोच रहा हूं: इस दृष्टिकोण से छुटकारा पाने के लिए क्या फायदे होंगे और इसके बजाय लॉगिंग मॉड्यूल का उपयोग करें? मॉड्यूल विक्रेता परिप्रेक्ष्य से, मुझे अपने मॉड्यूल में लॉगिंग कार्यक्षमताओं का खुलासा कैसे करना चाहिए? मैं इस क्या करना चाहिए:

import logging 
logger = logging.getLogger("pyftpdlib") 

... और मेरे दस्तावेज़ में कहा गया है कि "लकड़हारा" है वस्तु जो माना जाता है मामले उपयोगकर्ता अनुकूलित करने के लिए कैसे लॉग व्यवहार करते हैं चाहता है में इस्तेमाल किया जाएगा? यह जानबूझ कर के रूप में एक पूर्व निर्धारित प्रारूप उत्पादन स्थापित करने के लिए वैध है:

FORMAT = '[%(asctime)] %(message)s' 
logging.basicConfig(format=FORMAT) 
logger = logging.getLogger('pyftpdlib') 

...?

क्या आप किसी तृतीय-पक्ष मॉड्यूल के बारे में सोच सकते हैं, क्या मैं सार्वजनिक एपीआई के हिस्से के रूप में लॉगिंग कार्यक्षमता का खुलासा और समेकित कहां से संकेत ले सकता हूं?

अग्रिम धन्यवाद।

उत्तर

0

यहां एक संसाधन है जिसका उपयोग मैं अनुकूलन योग्य logger बनाने के लिए करता था। मैंने बहुत कुछ नहीं बदला, मैंने अभी एक कथन जोड़ा है, और मैं फ़ाइल या सिर्फ कंसोल पर लॉग इन करना चाहता हूं या नहीं।

this रंगीन बाहर की जाँच करें। आउटपुट को रंग देने के लिए यह वास्तव में अच्छा है इसलिए DEBUG WARN से अलग दिखता है जो INFO से अलग दिखता है।

लॉगिंग मॉड्यूल बहुत अच्छी कार्यक्षमता, जैसे कि एसएमटीपी लॉगिंग, फ़ाइल रोटेशन लॉगिंग (जैसे आप दो पुरानी लॉग फाइलों को सहेज सकते हैं, लेकिन हर बार कुछ गलत होने पर 100% नहीं बना सकते हैं) की एक अच्छी कार्यक्षमता का एक समूह है।

यदि आप कभी भी पायथन 3 में माइग्रेट करना चाहते हैं, तो लॉगिंग मॉड्यूल का उपयोग करके आपके प्रिंट स्टेटमेंट को बदलने की आवश्यकता को हटा दिया जाएगा।

लॉगिंग आपके द्वारा किए जा रहे कार्यों के आधार पर शानदार है, मैंने यह देखने के लिए केवल हल्के ढंग से इसका उपयोग किया है कि मैं कहां हूं (यदि आप इस फ़ंक्शन को चला रहे हैं, इस तरह से रंग दें), लेकिन इसमें काफी कुछ है एक नियमित प्रिंट स्टेटमेंट की तुलना में शक्ति।

0

आप Django (बस एक नमूना प्रोजेक्ट बनाएं) देख सकते हैं और देखें कि यह लॉगर सबसिस्टम को कैसे प्रारंभ करता है।

एक contextual logger helper भी है जिसे मैंने कुछ समय पहले लिखा है - यह लॉगर स्वचालित रूप से मॉड्यूल/कक्षा/फ़ंक्शन का नाम लेता है।यह डीबग संदेशों के लिए बहुत उपयोगी है जहां आप सही मॉड्यूल देख सकते हैं कि मॉड्यूल संदेशों को थूकता है और कॉल प्रवाह कैसे जाता है।

3

पुस्तकालय (FTP सर्वर या क्लाइंट लाइब्रेरी) लॉगिंग सिस्टम को कभी प्रारंभ नहीं करना चाहिए। तो लॉगर ऑब्जेक्ट को तुरंत चालू करना और प्रलेखन में लॉगिंग.बासिक कॉनफिग पर इंगित करना ठीक है (या फैनसीयर आउटपुट के साथ मूल कॉन्फिग की लाइनों के साथ एक फ़ंक्शन प्रदान करें और उपयोगकर्ता को अपनी लॉगिंग कॉन्फ़िगरेशन रणनीति, सादा मूल कॉन्फ़िग या लाइब्रेरी के बीच चयन करने दें उपलब्ध कराया गया कॉन्फ़िगरेशन)

चौखटे (जैसे Django) या सर्वर (एफ़टीपी सर्वर डेमॉन) एक उचित डिफ़ॉल्ट करने के लिए लॉगिंग सिस्टम को प्रारंभ और लॉगिंग सिस्टम विन्यास का अनुकूलन के लिए अनुमति चाहिए।

2

आमतौर पर पुस्तकालयों को केवल NullHandler हैंडलर बनाना चाहिए, जो कि केवल कुछ भी नहीं हैंडलर है। अंतिम लाइब्रेरी का उपयोग करने वाले अंतिम उपयोगकर्ता या एप्लिकेशन डेवलपर तब लॉगिंग सिस्टम को कॉन्फ़िगर कर सकते हैं। अधिक जानकारी के लिए logging दस्तावेज़ में अनुभाग Configuring Logging for a Library देखें। विशेष रूप से, टिप्पणी जो

यह दृढ़ता से सलाह दी जाती है कि आप किसी भी अपनी लाइब्रेरी के वालों के लिए NullHandler के अलावा अन्य संचालकों में शामिल न करें शुरू होता है देखते हैं।

आपके मामले में मैं बस एक प्रवेश हैंडलर बनाने के लिए, प्रति लॉगिंग प्रलेखन के रूप में होता है,

import logging 
logging.getLogger('pyftpdlib').addHandler(logging.NullHandler()) 

संपादित प्रवेश कार्यान्वयन प्रश्न में का खाका खींचा पूरी तरह से उचित लगता है। अपने दस्तावेज़ में बस logger का उल्लेख करें और उपयोगकर्ताओं को अपनी लाइब्रेरी से आउटपुट को अनुकूलित करने के लिए logging.setLevel और logging.setFormatter विधियों पर चर्चा करें या इंगित करें। logging.basicConfig(format=FORMAT) का उपयोग करने के बजाय आप अपने आउटपुट के लिए सेटिंग्स का प्रबंधन करने के लिए logging.config.fileConfig का उपयोग करने पर विचार कर सकते हैं और कॉन्फ़िगरेशन फ़ाइल को अपने दस्तावेज़ में कहीं भी दस्तावेज कर सकते हैं, फिर उपयोगकर्ता को इस फ़ाइल में अपेक्षित प्रारूप के लिए लॉगिंग मॉड्यूल दस्तावेज़ को इंगित कर सकते हैं।

+0

क्या इसका मतलब है कि डिफ़ॉल्ट रूप से कोई आउटपुट नहीं बनाया जाएगा? उस मामले में मैं इससे खुश नहीं हूं। –

+0

यह डिफ़ॉल्ट रूप से किसी भी आउटपुट का उत्पादन नहीं करेगा। साथ ही, 'लॉगिंग। नलहैंडलर' केवल पायथन 2.7 (और> 3.2 मुझे लगता है) में उपलब्ध है, जो एक समस्या हो सकती है। यदि आप केवल 'logger = logging.getLogger (' pyftpdlib ') का उपयोग करते हैं, तो आपको डिफ़ॉल्ट रूप से संदेश मिलेंगे और आप आउटपुट को कॉन्फ़िगर करने के तरीके को प्रदर्शित करने के लिए अपने उपयोगकर्ताओं को' logging.setLevel' और 'logging.setFormatter' दस्तावेज़' पर इंगित कर सकते हैं। आपकी पुस्तकालय के लिए संदेश। साथ ही, आप फ़ाइल कॉन्फ़िगरेशन ['logging.config.fileConfig'] (http://docs.python.org/dev/library/logging.config.html#logging.config.fileConfig) का उपयोग कर उपयोगकर्ताओं को कॉन्फ़िगर करने की अनुमति देने के लिए उपयोग कर सकते हैं लॉगर – Chris

+0

इसके अलावा, अपने मूल प्रश्नों में से किसी एक का जवाब देने के लिए, प्रिंट विवरणों के बजाय लॉगिंग का उपयोग करने का लाभ संक्षेप में [पीईपी 282] (http://www.python.org/dev/peps/pep-0282/) में उल्लिखित है: * यदि मानक लाइब्रेरी में एक एकल लॉगिंग तंत्र स्थापित किया गया है, 1) लॉगिंग को 'अच्छी तरह से' करने की अधिक संभावना है, और 2) एकाधिक पुस्तकालय बड़े अनुप्रयोगों में एकीकृत किए जा सकेंगे जिन्हें उचित रूप से सुसंगत रूप से लॉग किया जा सकता है। * – Chris

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