有办法在错误日志中包含用户代理吗?

3 投票
2 回答
1262 浏览
提问于 2025-04-18 04:37

我在用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)

通过这个方法,我能够收到自己发送的错误日志邮件。

撰写回答