2014-10-26 7 views
20

मैं फ्लास्क का उपयोग करने वाले वेब एप्लिकेशन में लॉगिंग जोड़ने की कोशिश कर रहा हूं।फनस्क एप्लिकेशन Gunicorn द्वारा होस्ट किए जाने पर कोई लॉग क्यों नहीं बना रहा है?

जब अंतर्निहित सर्वर (यानी python3 server.py) का उपयोग करके होस्ट किया गया, तो लॉगिंग कार्य करता है। Gunicorn का उपयोग करके होस्ट किया गया, लॉग फ़ाइल नहीं बनाई गई है।

सरल कोड है जो समस्या reproduces यह एक है:

#!/usr/bin/env python 

import logging 
from flask import Flask 
flaskApp = Flask(__name__) 


@flaskApp.route('/') 
def index(): 
    flaskApp.logger.info('Log message') 
    print('Direct output') 
    return 'Hello World\n' 


if __name__ == "__main__": 
    logHandler = logging.FileHandler('/var/log/demo/app.log') 
    logHandler.setLevel(logging.INFO) 
    flaskApp.logger.addHandler(logHandler) 
    flaskApp.logger.setLevel(logging.INFO) 
    flaskApp.run() 

अनुप्रयोग का उपयोग कहा जाता है:

gunicorn server:flaskApp -b :80 -w 4 
    --access-gfile /var/log/demo/access.log 
    --error-logfile /var/log/demo/error.log 

जब साइट के मुखपृष्ठ के लिए एक अनुरोध कर रही है, निम्न होता :

  1. मुझे प्रतिक्रिया में अपेक्षित HTTP 200 "हैलो वर्ल्ड \ n" प्राप्त होता है।

  2. /var/log/demo/access.log में अनुरोध का एक निशान है।

  3. /var/log/demo/error.log वही रहता है (केवल बूट ईवेंट हैं)।

  4. टर्मिनल में "प्रत्यक्ष आउटपुट" लाइन है।

  5. कोई '/var/log/demo/app.log' नहीं है। यदि मैं एप्लिकेशन लॉन्च करने से पहले फ़ाइल बना देता हूं, तो फ़ाइल संशोधित नहीं होती है।

ध्यान दें कि:

  • निर्देशिका /var/log/demo पहुँचा जा सकता है (पढ़ने, लिखने, निष्पादित) हर किसी के द्वारा, तो यह अनुमतियाँ मुद्दा नहीं है।

  • यदि मैं दूसरे हैंडलर के रूप में StreamHandler जोड़ता हूं, तो अभी भी टर्मिनल में "लॉग संदेश" संदेश का कोई निशान नहीं है, न ही गनिकॉर्न लॉग फ़ाइलों में।

  • pip3 install gunicorn का उपयोग करके गनिकॉर्न स्थापित किया गया है, इसलिए पाइथन संस्करणों के साथ कोई मेल नहीं होना चाहिए।

क्या हो रहा है?

उत्तर

24

जब आप python3 server.py का उपयोग करते हैं तो आप server3.py स्क्रिप्ट चला रहे हैं।

जब आप का उपयोग gunicorn server:flaskApp ... आप gunicorn स्टार्टअप स्क्रिप्ट चला रहे हैं जो तब आयात मॉड्यूल server और चर flaskApp कि मॉड्यूल में के लिए लग रहा है।

server.py के बाद से आयात किया जा रहा है __name__ वर "server", नहीं "__main__" में शामिल होंगे और इसलिए आप लोग इन हैंडलर सेटअप कोड रन नहीं किया जा रहा है।

आप if __name__ == "__main__": स्टांजा के बाहर लॉग हैंडलर सेटअप कोड को आसानी से ले जा सकते हैं।लेकिन सुनिश्चित करें कि आप रखते हैं क्योंकि आप नहीं चाहते हैं कि बंदूकधारी आयात server आयात करे।

अधिक what does if __name__ == “__main__”: do? के बारे में

+0

यह भी ध्यान रखें उत्पादन मोड में है कि कुप्पी रन से गनिकोर्न के तहत डिफ़ॉल्ट, जहां app.logger स्तर WARN पर सेट है, इसलिए आपको app.logger.info() या app.logger.debug() दिखाई नहीं देगा। यदि आप इसे चाहते हैं, तो app.debug = True सेट करें। – patricksurry

8

यह दृष्टिकोण मेरे लिए काम करता है: अजगर लॉगिंग मॉड्यूल आयात करें और उसे करने के लिए gunicorn की त्रुटि संचालकों जोड़ें। फिर अपने लकड़हारा gunicorn त्रुटि लॉग फ़ाइल में प्रवेश करेंगे:

import logging 

app = Flask(__name__) 

gunicorn_error_logger = logging.getLogger('gunicorn.error') 
app.logger.handlers.extend(gunicorn_error_logger.handlers) 
app.logger.setLevel(logging.DEBUG) 
app.logger.debug('this will show in the log') 

मेरे Gunicorn स्टार्टअप स्क्रिप्ट इतनी तरह एक फाइल करने के लिए उत्पादन लॉग प्रविष्टियों के लिए कॉन्फ़िगर है:

gunicorn main:app \ 
    --workers 4 \ 
    --bind 0.0.0.0:9000 \ 
    --log-file /app/logs/gunicorn.log \ 
    --log-level DEBUG \ 
    --reload 
+0

क्या मैं कमांड लाइन के बजाय स्क्रिप्ट के अंदर लॉग फ़ाइल का पथ जोड़ सकता हूं? –

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

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