我有Flask安装程序在发生错误时给我发电子邮件,但我想在该电子邮件中包含UserAgent。那可能吗?我没有在The docs看到它。有没有办法在错误日志中包含useragent?
编辑:该链接说更多的东西可以在官方文档中找到,但不是官方文档? (flask.readthedocs.org说同样的事情)
我有Flask安装程序在发生错误时给我发电子邮件,但我想在该电子邮件中包含UserAgent。那可能吗?我没有在The docs看到它。有没有办法在错误日志中包含useragent?
编辑:该链接说更多的东西可以在官方文档中找到,但不是官方文档? (flask.readthedocs.org说同样的事情)
我发现如何在this article深处做到这一点。您需要设置一个新的过滤器来将用户代理添加到记录中。看起来在过滤阶段,您可以使用请求对象来获取您要查找的内容。所以你实际上没有过滤任何东西,但是在日志记录中添加更多内容。功能示例:
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', '[email protected]',
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)
使用此功能,我可以收到发送给我自己的错误日志的电子邮件。
我认为你的答案是在文档中单击一下。检查出自定义电子邮件格式的this entry。使用示例代码剪切,添加Flask request
对象的导入。使用this question中的方法获取字符串本身。
from logging import Formatter
from flask import request
mail_handler.setFormatter(Formatter('''
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
UserAgent: %s
Message:
%(message)s
''' % flask.request.user_agent.string))
这可能不是完美的(特别是我的字符串格式化代码),但希望这篇文章点,你在正确的方向。
我收到一个错误:RuntimeError:在请求上下文之外工作 –
有趣的是,在创建日志记录时,您不能访问应用程序全局变量。您至少可以获得LogRecord类的任何[这些](https://docs.python.org/dev/library/logging.html#logging.LogRecord)属性。我将不得不继续挖掘,看看是否有办法在设置mail_handler的阶段获取全局上下文变量。 – voteblake
可能与http://stackoverflow.com/questions/9878020/how-do-i-get-the-user-agent-with-flask重复 – xbb
@xbb:我看到了,但我的问题是更具体:如何在错误电子邮件中包含UserAgent(或者甚至如何访问错误电子邮件的请求对象)? –