2010-07-05 18 views
6

मेरे पास एक लिनक्स सर्वर पर एक Django ऐप है। विचारों में से एक में, print कमांड का कुछ रूप निष्पादित किया गया है, और कुछ स्ट्रिंग मुद्रित हो जाती हैं। मैं कैसे पता लगा सकता हूं कि मुद्रित स्ट्रिंग क्या थी? क्या कोई लॉग इन है जिसमें इन चीजों को रखा जाता है?जब मैं अपने Django ऐप से उन्हें 'प्रिंट' करता हूं तो चीजें कहां जाती हैं?

उत्तर

4

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

जैसा कि लिंक्डलिंक्ड इंगित किया गया है, print का उपयोग नहीं करना सबसे अच्छा है, क्योंकि इससे अपवाद हो सकते हैं! लेकिन यह एकमात्र कारण नहीं है: ऐसे उद्देश्यों के लिए मॉड्यूल (जैसे logging) बनाए गए हैं और उनके पास बहुत अधिक विकल्प हैं।

This site (तब भी जब यह 2008 से है) मेरे बयान की पुष्टि करें:

आप को पता है कि एक दृश्य के अंदर हो रहा है चाहते हैं, तेज तरीका एक प्रिंट बयान में ड्रॉप करने के लिए है। विकास सर्वर किसी भी प्रिंट स्टेटमेंट को सीधे टर्मिनल पर आउटपुट करता है; यह जावास्क्रिप्ट अलर्ट() के सर्वर-साइड विकल्प है।

यदि आप अपने लॉगिंग के साथ थोड़ा अधिक परिष्कृत बनना चाहते हैं, तो यह पाइथन के लॉगिंग मॉड्यूल (मानक लाइब्रेरी का हिस्सा) में बदलना उचित है। आप अपने settings.py में यह कॉन्फ़िगर कर सकते हैं: यहाँ वह वर्णन करता है, (साइट पर नज़र)

डिबगिंग-प्रयोजनों के लिए आप भी debug-mode सक्षम या django-debug-toolbar इस्तेमाल कर सकते हैं कि क्या करना है।

उम्मीद है कि यह मदद करता है! :)

+0

यह सही है। साथ ही, यदि आप फ़ाइलों को सर्वर पर अपाचे का उपयोग कर रहे हैं, तो मुझे पता है कि जब भी आप 'प्रिंट' कथन दबाते हैं तो mod_wsgi एक अप्राप्य त्रुटि फेंकता है; जैसे यदि आप 'प्रिंट' करते हैं तो अय्यूब ठीक हो गया है! "आपके ऐप में, जब आप इसे अपाचे पर डालते हैं तो आपकी स्क्रिप्ट मर जाएगी (असीमित अपवाद)। इस कारण से, मैं अपने django ऐप्स में प्रिंट का उपयोग करने से बचता हूं। – linked

+0

@ लिंक्डलिंक्ड: केवल तभी यदि आप उपयुक्त कॉन्फ़िगरेशन निर्देशों का उपयोग नहीं करते हैं। –

1

प्रिंट "./manage.py रनरवर" या अन्य भिन्नताओं के साथ ठीक दिखता है - जैसे जोशुआ उल्लेख करता है, यह टर्मिनल में दिखाई देता है जहां आपने इसे शुरू किया था। यदि आप क्रॉन या ऐसे से एफसीजीआई चला रहे हैं, तो यह केवल शून्यता में फंस जाता है और आप इसे पूरी तरह से खो देते हैं।

उन स्थानों के लिए जहां मैं चेतावनी या नोटिस जैसे "प्रिंट" करना चाहता हूं, मैं पाइथन के लॉगर का एक उदाहरण उपयोग करता हूं जो आउटपुट को कैप्चर करने और इसे किसी जगह पर रखने के लिए syslog पर जाता है। मैं मॉड्यूल में से एक में प्रवेश का एक उदाहरण का दृष्टांत के रूप में यह लोड हो जाता है - models.py जगह मैं उठाया, बस अपनी सुविधा के लिए था और मैं यह हमेशा का मूल्यांकन किया जायेगा से पहले अनुरोधों में रोलिंग आया जानता था

import logging, logging.handlers 

logger = logging.getLogger("djangosyslog") 
hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON) 
formatter = logging.Formatter('%(filename)s: %(levelname)s: %(message)s') 
hdlr.setFormatter(formatter) 
logger.addHandler(hdlr) 

। फिर जब आप अपने विचारों में लकड़हारा या जो कुछ भी करने के लिए संदेश आह्वान करने के लिए करना चाहते हैं:

logger = logging.getLogger("djangosyslog") 
logging.warning("Protocol problem: %s", "connection reset", extra=d) 

है .त्रुटि(), .critical(), और अधिक - वास्ते जानकारी के लिए http://docs.python.org/library/logging.html की जाँच करें।

रॉब हडसन की डीबग टूलबार बहुत अच्छी है यदि आप उस डीबग जानकारी की तलाश में हैं - मैं इसे अक्सर विकास में उपयोग करता हूं। यह आपको किसी भी दिए गए पृष्ठ को उत्पन्न करने के लिए उपयोग किए गए SQL सहित वर्तमान अनुरोध और प्रतिक्रिया के बारे में डेटा देता है। आप तारों को संदर्भ/प्रतिक्रिया में रुचि रखते हुए प्रिंट को उस डेटा में इंजेक्ट कर सकते हैं - लेकिन मुझे लगता है कि इससे निपटने में थोड़ा मुश्किल होना चाहिए।

0

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

2

कभी भी प्रिंट का उपयोग न करें, जैसा कि आप तैनात करते हैं, यह stdout पर प्रिंट करेगा और डब्लूजीएसआई टूट जाएगा।

लॉगिंग का उपयोग करें। विकास उद्देश्यों के लिए, सेटअप करना वास्तव में आसान है। आपकी परियोजना पर __init__.py:

import logging 
from django.conf import settings 

fmt = getattr(settings, 'LOG_FORMAT', None) 
lvl = getattr(settings, 'LOG_LEVEL', logging.DEBUG) 

logging.basicConfig(format=fmt, level=lvl) 
logging.debug("Logging started on %s for %s" % (logging.root.name, logging.getLevelName(lvl))) 

अब जो कुछ भी आप लॉग करते हैं, वह इस मामले में, आपका टर्मिनल है।

logging.debug("Oh hai!") 

इसके अलावा आप एक LOG_LEVEL सेटिंग के साथ अपने settings.py पर शब्दाडंबर नियंत्रित कर सकते हैं।

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