我有Flask设置,当发生错误时给我发电子邮件,但我想在该电子邮件中包含UserAgent。那可能吗?我在The docs中没有看到它。
编辑:该链接说明官方文档中可以找到更多东西,但官方文档是不是? (flask.readthedocs.org说同样的事情)
答案 0 :(得分:3)
我在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', '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)
使用此功能,我可以收到发送给自己的电子邮件以获取错误日志。
答案 1 :(得分:0)
我认为您的回答只需点击一下即可。查看有关自定义电子邮件格式的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))
这可能不完美(尤其是我的字符串格式代码),但希望这篇文章能指出正确的方向。