How to debug/log wsgi python app?

24,301

Note that the above code won't actually produce any log whatsoever since your not calling any of the logger.log() variants - but I guess that's not the point.

If you're running your code with apache/mod_wsgi, the simplest solution is to configure your logger(s) to log to sys.stderr using a StreamHandler (cf http://docs.python.org/howto/logging.html#configuring-logging), and define the error log path, name and level in your apache conf (beware, the default apache behaviour is to only log "error level" message).

Share:
24,301
shibly
Author by

shibly

Updated on July 09, 2022

Comments

  • shibly
    shibly almost 2 years

    I tried this:

    #!/usr/bin/python    
    
    from wsgiref.simple_server import make_server
    from cgi import parse_qs, escape
    import logging
    import os
    import sys
    
    html = """
    <html>
    <body>
       <form method="post" action="parsing_post.wsgi">
          <p>
             Age: <input type="text" name="age">
             </p>
          <p>
             Hobbies:
             <input name="hobbies" type="checkbox" value="software"> Software
             <input name="hobbies" type="checkbox" value="tunning"> Auto Tunning
             </p>
          <p>
             <input type="submit" value="Submit">
             </p>
          </form>
       <p>
          Age: %s<br>
          Hobbies: %s
          </p>
       </body>
    </html>
    """
    
    def application(environ, start_response):
    
       # the environment variable CONTENT_LENGTH may be empty or missing
       try:
          request_body_size = int(environ.get('CONTENT_LENGTH', 0))
       except (ValueError):
          request_body_size = 0
    
       # When the method is POST the query string will be sent
       # in the HTTP request body which is passed by the WSGI server
       # in the file like wsgi.input environment variable.
       logger = logging.getLogger(__name__)
       request_body = environ['wsgi.input'].read(request_body_size)
       d = parse_qs(request_body)
    
    
       age = d.get('age', [''])[0] # Returns the first age value.
       hobbies = d.get('hobbies', []) # Returns a list of hobbies.
    
       # Always escape user input to avoid script injection
       age = escape(age)
       hobbies = [escape(hobby) for hobby in hobbies]
    
       response_body = html % (age or 'Empty',
                   ', '.join(hobbies or ['No Hobbies']))
    
       status = '200 OK'
    
       response_headers = [('Content-Type', 'text/html'),
                      ('Content-Length', str(len(response_body)))]
       start_response(status, response_headers)
    
       return [response_body]
    

    But i don't know where it logs. I'm trying to display/log the value on webpage or in a file /var/log/apache2/myapp.log

    What's the best way to do this?

    Any answer will be highly appreciated.