2012-11-01 10 views
16

मैं Google App Engine पर Django-Nonrel के साथ काम कर रहा हूं, जो मुझे प्रिंट() के बजाय logging.debug() का उपयोग करने के लिए मजबूर करता है।पायथन- लॉग कैसे फ़्लश करें? (django)

"लॉगिंग" मॉड्यूल Django द्वारा प्रदान किया जाता है, लेकिन मुझे प्रिंट() के बजाय इसका उपयोग करने में कोई कठिन समय नहीं है।

उदाहरण के लिए, यदि मुझे चर एक्स में आयोजित सामग्री को सत्यापित करने की आवश्यकता है, तो मैं
logging.debug('x is: %s' % x) डाल दूंगा। लेकिन अगर कार्यक्रम जल्द ही (स्ट्रीम को फ्लश किए बिना) क्रैश हो जाता है, तो यह कभी मुद्रित नहीं होता है।

तो डीबगिंग के लिए, मुझे त्रुटि से बाहर निकलने से पहले डीबग() को फ्लश करने की आवश्यकता है, और यह नहीं हो रहा है।

+0

आपके प्रश्न का उत्तर नहीं है लेकिन आप फिर भी 'प्रिंट' का उपयोग क्यों करेंगे ?! – aschmid00

+1

लॉग का "फ़्लशिंग" से आपका क्या मतलब है? –

+0

उम्मीद है कि सूचीबद्ध उदाहरण समझने में मदद करता है। – Rucent88

उत्तर

9

मुझे लगता है कि यह आप के लिए काम कर सकते हैं आप केवल एक (या डिफ़ॉल्ट) हैंडलर का उपयोग कर रहे संभालने:

>>> import logging 
>>> logger = logging.getLogger() 
>>> logging.debug('wat wat') 
>>> logger.handlers[0].flush() 

यह एक तरह से हालांकि, दस्तावेज में पर सिकोड़ी है।

आवेदन कोड सीधे प्रारंभ नहीं करना चाहिए और हैंडलर के उदाहरणों का उपयोग नहीं करना चाहिए। इसके बजाए, हैंडलर क्लास एक बेस क्लास है जो इंटरफ़ेस को परिभाषित करती है कि सभी हैंडलर के पास होना चाहिए और कुछ डिफ़ॉल्ट व्यवहार स्थापित करना चाहिए जो कि बच्चे कक्षाएं (या ओवरराइड) का उपयोग कर सकती हैं। http://docs.python.org/2/howto/logging.html#handler-basic

और यह एक प्रदर्शन नाली हो सकता है, लेकिन अगर आप वास्तव में समस्या आ रही है, यह आपके डिबगिंग के साथ मदद कर सकता है।

+1

उह, लोगों को अपने लॉग को फ्लश करना कितना भयानक है यदि एकमात्र तरीका हैडलर के माध्यम से है जिसे आप एक्सेस नहीं करना चाहते हैं? वह टूटा लगता है। –

+1

नहीं, यह दस्तावेज कहता है कि यह बिल्कुल नहीं है। उपरोक्त उद्धरण का अर्थ है कि आपको केवल हैंडलर के बजाय, हैंडलर के * सबक्लास * का तत्काल उपयोग करना चाहिए। आपका कोड केवल किसी भी हैंडलर कक्षाओं का उपयोग किसी और द्वारा तत्काल किया जाता है, इसलिए कोई समस्या नहीं है। – Hjulle

+3

वास्तव में बहुत उपयोगी है; मुझे अभी भी यह बेहद अजीब लगता है कि मैं अपनी कॉन्फ़िगरेशन में बेवकूफ लॉगर को बताने में सक्षम नहीं हूं कि यह हमेशा फ्लश करता है; लेकिन मेरे क्लाइंट कोड को इसे लागू करना है। – GhostCat

5

Django लॉगिंग मानक पायथन लॉगिंग मॉड्यूल पर निर्भर करता है। logging.shutdown() जो संचालकों के सभी flushes और प्रवेश प्रणाली बंद हो जाता है

इस समारोह शो के कोड का निरीक्षण (यानी प्रवेश अब यह कहा जाता है के बाद नहीं किया जा सकता):

इस मॉड्यूल एक मॉड्यूल स्तरीय विधि है कि वर्तमान में (अजगर 2.7) प्रवेश मॉड्यूल एक मॉड्यूल-स्तर चर _handlerList तथाकथित में सभी संचालकों संचालकों के सभी तरह

[h_weak_ref().flush() for h_weak_ref in logging._handlerList] 

कुछ कर रही है क्योंकि इस समाधान का उपयोग करता द्वारा प्लावित किया जा सकता करने के लिए कमजोर संदर्भ की एक सूची रखता है उपरोक्त मॉड्यूल @ माइक समाधान का आंतरिक बेहतर है, लेकिन यह रिलायंस है

[h.flush() for h in my_logger.handlerList] 
1

हैं उपयोग के मामले है कि आप एक अजगर प्रोग्राम है जो अपनी लॉग फ्लश चाहिए जब बाहर निकलने है, logging.shutdown() का उपयोग करें: एक लकड़हारा के लिए उपयोग होने पर एँ, यह इस प्रकार है सामान्यीकृत किया जा सकता।

अजगर प्रलेखन से:

logging.shutdown()

निस्तब्धता और सभी संचालकों को बंद करके एक व्यवस्थित शटडाउन निष्पादित करने के लिए लॉगिंग प्रणाली को सूचित। इसे एप्लिकेशन से बाहर निकलने पर कहा जाना चाहिए और इस कॉल के बाद लॉगिंग सिस्टम का कोई और उपयोग होना चाहिए।

4

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

import sys 
import logging 


def init_logger(): 
    logger = logging.getLogger() 

    h = logging.StreamHandler(sys.stdout) 
    h.flush = sys.stdout.flush 
    logger.addHandler(h) 

    return logger 

फिर, अपने कोड में logging के बजाय का उपयोग करें:

def f(): 
    logger = init_logger() 
    logger.debug('...') 

नतीजतन, आप जीता ' अब लॉग इन करने के साथ समस्याएं हैं।

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