问题
The Flask tutorial has an example of emailing yourself when an error occurs. I would like to add some information from request
, but kept receiving an error:
RuntimeError: working outside of request context
Here is what I have:
if __name__ == '__main__':
if not app.debug:
# create mail handler
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler('127.0.0.1',
'server-error@example.com',
['admin@example.com'], 'YourApplication Failed')
# Log format
from logging import Formatter
mail_handler.setFormatter(Formatter('''
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
Message:
%(message)s
''' % request.headers )) # Added request here
# Attach log handler to app
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
How do I get the request context for logging?
回答1:
You actually need to add a filter to add what you want to the logger:
import logging
class ContextualFilter(logging.Filter):
def filter(self, log_record):
log_record.url = request.path
log_record.method = request.method
log_record.ip = request.environ.get("REMOTE_ADDR")
log_record.headers = request.headers
return True
Then you can register the filter with the app's logger:
context_provider = ContextualFilter()
app.logger.addFilter(context_provider)
And use the extra keys you added to the context in your formatter:
mail_handler.setFormatter(Formatter('''
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
URL: %(url)s
Method: %(method)s
Headers: %(headers)s
Message:
%(message)s
'''))
Why can't I just add request.headers
to my formatter
Two reasons:
- There is no request context when you're setting up the logger since no request is inbound
- Even if there was, that code won't actually do what you want it to do. It will add the request headers from the request in scope when you set up the logger (so all requests will be that first request).
See also: https://realpython.com/blog/python/python-web-applications-with-flask-part-iii/
来源:https://stackoverflow.com/questions/32359211/getting-request-context-for-error-logging-in-flask