Reputation: 1923
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',
'[email protected]',
['[email protected]'], '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?
Upvotes: 3
Views: 3078
Reputation: 159875
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
'''))
request.headers
to my formatterTwo reasons:
See also: https://realpython.com/blog/python/python-web-applications-with-flask-part-iii/
Upvotes: 9