有办法在错误日志中包含用户代理吗?
我在用Flask设置一个功能,当出现错误时会给我发邮件,但我想在邮件里加上用户的浏览器信息(UserAgent)。这样做可以吗?我在文档里没看到相关内容。
补充:链接里说可以在官方文档找到更多信息,但那不就是官方文档吗?(flask.readthedocs.org也说了同样的事)
2 个回答
0
我觉得你的问题在文档里就有答案,只差你去找一下。可以看看这个链接,里面讲的是如何自定义邮件消息的格式。你可以参考里面的示例代码,记得要引入Flask的request
对象。要获取具体的字符串,可以用这个问题里的方法。
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))
这可能不是完美的(尤其是我的字符串格式代码),但希望那篇文章能给你指明方向。
2
我在这篇文章中发现了如何做到这一点。你需要设置一个新的过滤器,把用户代理信息添加到记录中。看起来在过滤的阶段,你可以使用请求对象来获取你想要的信息。所以其实你并不是在过滤掉什么,而是往日志记录中添加更多内容。下面是一个功能示例:
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)
通过这个方法,我能够收到自己发送的错误日志邮件。