2010-09-20 12 views
5

मैं एक पिलोन ऐप पर काम कर रहा हूं जो अपाचे के शीर्ष पर mod_wsgi के साथ चलता है। मैं लॉगिंग संदेश भेजना चाहता हूं कि मेरा ऐप अपाचे के लॉग के बजाय, मेरे ऐप की निर्देशिका में फ़ाइलों को जेनरेट करता है। इसके अलावा, मैं एक सापेक्ष पथ के माध्यम से लॉगफाइल का स्थान निर्दिष्ट करना चाहता हूं ताकि मेरे ऐप को अन्य लोगों के सर्वर पर तैनात करना आसान हो जाएगा। अभी मैं फाइलों पर लॉग इन कर सकता हूं, लेकिन केवल एक नाजुक पूर्ण पथ के माध्यम से।फ़ाइलों को लॉग इन करने के लिए सापेक्ष पथ का उपयोग करना Pylons 'develop.ini

# Logging configuration 
[loggers] 
keys = root, routes, myapp, sqlalchemy, debugging-logger 

[handlers] 
keys = console, debugging-logger-file 

[formatters] 
keys = generic 

[logger_debugging-logger] 
level = DEBUG 
handlers = debugging-logger-file 
qualname = myapp.controllers.logging-test-controller.debugging-logger 

[handler_debugging-logger-file] 
class = FileHandler 
args = ('/var/pylons/myapp/logs/myapp-debugging-errors.log', 'a') 
level = DEBUG 
formatter = generic 

हालांकि .ini सहायक में% (यहाँ)% (यहाँ) का उपयोग वर्तमान पथ का उल्लेख करने के है, s का उपयोग करके सलाह देता है:

यहाँ मेरी development.ini फ़ाइल के प्रासंगिक हिस्सा है "args = ('foo')" त्रुटि हैंडलर की रेखा उस तरीके से व्यवहार नहीं करती जिसकी मैं अपेक्षा करता हूं। इस आईएनआई फ़ाइल का सिंटैक्स documented on the Paste Deploy site है, लेकिन यह निर्दिष्ट नहीं करता है कि उद्धृत तारों के संबंध में% (यहां) का उपयोग कैसे किया जा सकता है।

वर्तमान पथ निर्दिष्ट करने के लिए "args = ('foo')" पंक्ति में मुझे किस वाक्यविन्यास का उपयोग करना चाहिए?

उत्तर

7

समस्या यह है कि पेस्ट परिनियोजन एक कॉन्फ़िगर पार्स ऑब्जेक्ट बनाता है जो 'यहां' टैग को डिफ़ॉल्ट के सेट में संग्रहीत करने के लिए बनाता है, और logging.config.fileConfig() को डिफ़ॉल्ट रूप से सेट नहीं किया जाता है। इसलिए, जब fileConfig() .ini फ़ाइल को पढ़ता है, तो उसे 'यहां' टैग तक पहुंच नहीं है, और ConfigParser का इंटरपोलेशन इसे नहीं ढूंढ सकता है।

आप कुछ इस तरह कर सकता है:

[DEFAULT] 
my_log_dir = '/var/pylons/myapp/logs' 
... 
[handler_debugging-logger-file] 
args = (%(my_log_dir)s + '/myapp-debugging-errors.log', 'a') 

आप के लिए नहीं वास्तव में क्या देख रहे हैं, लेकिन एक छोटा सा अधिक विन्यास।

एक और संभावना है:

args = (os.getcwd() + '/myapp-debugging-errors.log', 'a') 

(यह काम करता है क्योंकि 'ओएस' लॉगिंग मॉड्यूल के नाम स्थान में एक वैध चर रहा है जब यह) आर्ग मूल्य पर eval कॉल (लेकिन इस के एक कार्यान्वयन विस्तार है। लॉगिंग पैकेज जो विश्वसनीय दीर्घकालिक नहीं हो सकता है।) लेकिन यह संभवतः आपको वह नहीं देगा जो आप चाहते हैं - यह संभवतः अपाचे प्रक्रिया की कार्यशील निर्देशिका का उपयोग करेगा।

तुम भी कार्यक्रम के बाहर एक वातावरण चर सेट सकता है, और इसका इस्तेमाल चाहते:

args = (os.environ['MY_LOG_DIR'] + '/myapp-debugging-errors.log', 'a') 

और फिर भी एक और संभावना कार्य या प्रवेश मॉड्यूल या पेस्ट पैकेज में कक्षा तरीकों के कुछ के व्यवहार अधिभावी है ।

आशा है कि वे आपको कुछ विचार दें।

+0

आह, जो मुझे मस्तिष्क-कार्य कूल्हे पर मिला। धन्यवाद। मैं अब के लिए पहला विकल्प उपयोग कर रहा हूं - यह कम से कम मुझे गैर-DRY होने से रोकता है, क्योंकि मैं कुछ अलग लॉग फ़ाइलों में संदेशों को विभाजित कर रहा हूं। –

0

पेस्ट परिनियोजन के लिए कॉन्फ़िगरेशन फ़ाइलें कॉन्फ़िगरेशन फ़ाइल कहां निर्देशिका को इंगित करने के लिए 'यहां' टैग की अनुमति देती हैं। इसके बाद आप इसके सापेक्ष काम कर सकते हैं।

+0

मैंने आपके उत्तर के जवाब में एक स्पष्टीकरण के साथ प्रश्न अपडेट किया है। –

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