Python 是否有办法将useragent包含在错误日志中?

Python 是否有办法将useragent包含在错误日志中?,python,flask,Python,Flask,我有烧瓶设置,当发生错误时给我发电子邮件,但我想在电子邮件中包括UserAgent。可能吗?我没有看到它 编辑:链接上说更多的东西可以在官方文件中找到,但那不是官方文件吗?(说同样的话)我想你的答案在文档中只需点击一下。查看自定义电子邮件格式。使用截取的示例代码,添加Flaskrequest对象的导入。使用中的方法获取字符串本身 这可能并不完美(尤其是我的字符串格式代码),但希望这篇文章为您指明了正确的方向。我在本文中深入了解了如何做到这一点。您需要设置一个新的筛选器,以便将用户代理添加到记录中

我有烧瓶设置,当发生错误时给我发电子邮件,但我想在电子邮件中包括UserAgent。可能吗?我没有看到它


编辑:链接上说更多的东西可以在官方文件中找到,但那不是官方文件吗?(说同样的话)

我想你的答案在文档中只需点击一下。查看自定义电子邮件格式。使用截取的示例代码,添加Flask
request
对象的导入。使用中的方法获取字符串本身


这可能并不完美(尤其是我的字符串格式代码),但希望这篇文章为您指明了正确的方向。

我在本文中深入了解了如何做到这一点。您需要设置一个新的筛选器,以便将用户代理添加到记录中。似乎在筛选阶段,您可以使用request对象来获取所需内容。因此,您实际上并没有过滤掉任何内容,而是向日志记录中添加了更多内容。功能示例:

from flask import Flask, request

app = Flask(__name__)

if not app.debug:
    import logging
    from logging.handlers import SMTPHandler

    class ContextualFilter(logging.Filter):
        def filter(self, log_record):
            log_record.user_agent = request.user_agent
            return True

    context_provider = ContextualFilter()
    app.logger.addFilter(context_provider)
    mail_handler = SMTPHandler('127.0.0.1', 'apperror@example.com',
                    app.config['ADMINS'], 'Application failed')
    mail_handler.setFormatter(logging.Formatter("""
Message type:       %(levelname)s
Location:           %(pathname)s:%(lineno)d
Module:             %(module)s
Function:           %(funcName)s
Time:               %(asctime)s
User-Agent:         %(user_agent)s

Message:

%(message)s
"""))
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)

使用此功能,我可以获得发送给自己的错误日志电子邮件。

可能是@xbb的副本:我看到了,但我的问题更具体:如何在错误电子邮件中包含UserAgent(或者甚至如何访问错误电子邮件的请求对象)?我得到一个错误:RuntimeError:在请求上下文之外工作,在创建日志记录时,您不能访问应用程序全局变量。您至少可以获取
LogRecord
类的任何属性。我必须继续挖掘,看看是否有办法在设置邮件处理程序的阶段获取全局上下文变量。
from flask import Flask, request

app = Flask(__name__)

if not app.debug:
    import logging
    from logging.handlers import SMTPHandler

    class ContextualFilter(logging.Filter):
        def filter(self, log_record):
            log_record.user_agent = request.user_agent
            return True

    context_provider = ContextualFilter()
    app.logger.addFilter(context_provider)
    mail_handler = SMTPHandler('127.0.0.1', 'apperror@example.com',
                    app.config['ADMINS'], 'Application failed')
    mail_handler.setFormatter(logging.Formatter("""
Message type:       %(levelname)s
Location:           %(pathname)s:%(lineno)d
Module:             %(module)s
Function:           %(funcName)s
Time:               %(asctime)s
User-Agent:         %(user_agent)s

Message:

%(message)s
"""))
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)