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