有没有办法在错误日志中包含useragent?

时间:2014-04-28 17:30:14

标签: python flask

我有Flask设置,当发生错误时给我发电子邮件,但我想在该电子邮件中包含UserAgent。那可能吗?我在The docs中没有看到它。

编辑:该链接说明官方文档中可以找到更多东西,但官方文档是不是? (flask.readthedocs.org说同样的事情)

2 个答案:

答案 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))

这可能不完美(尤其是我的字符串格式代码),但希望这篇文章能指出正确的方向。