Python 正在获取在Flask中记录错误的请求上下文?
Flask教程中有一个在发生错误时向自己发送电子邮件的示例。我想从Python 正在获取在Flask中记录错误的请求上下文?,python,error-handling,flask,error-logging,Python,Error Handling,Flask,Error Logging,Flask教程中有一个在发生错误时向自己发送电子邮件的示例。我想从请求中添加一些信息,但一直收到一个错误: RuntimeError: working outside of request context 以下是我所拥有的: if __name__ == '__main__': if not app.debug: # create mail handler import logging from logging.handlers
请求中添加一些信息,但一直收到一个错误:
RuntimeError: working outside of request context
以下是我所拥有的:
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)
如何获取日志记录的请求上下文?您实际上需要添加一个过滤器,以便向日志记录程序添加所需内容:
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
然后,您可以向应用程序的记录器注册过滤器:
context_provider = ContextualFilter()
app.logger.addFilter(context_provider)
并使用在格式化程序中添加到上下文的额外键:
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
添加到我的格式化程序中
原因有二:
设置记录器时没有请求上下文,因为没有入站请求
即使有,该代码也不会真正执行您希望它执行的操作。设置记录器时,它将从范围内的请求中添加请求头(因此所有请求都将是第一个请求)
另请参见:您是否能够解决此问题?我遇到了同样的问题。