Python 正在获取在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

Flask教程中有一个在发生错误时向自己发送电子邮件的示例。我想从
请求中添加一些信息,但一直收到一个错误:

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
添加到我的格式化程序中 原因有二:

  • 设置记录器时没有请求上下文,因为没有入站请求
  • 即使有,该代码也不会真正执行您希望它执行的操作。设置记录器时,它将从范围内的请求中添加请求头(因此所有请求都将是第一个请求)

  • 另请参见:

    您是否能够解决此问题?我遇到了同样的问题。