【问题标题】:Is there a way to include the useragent in the error log?有没有办法将用户代理包含在错误日志中?
【发布时间】:2014-06-14 09:05:04
【问题描述】:

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

编辑:链接说可以在官方文档中找到更多内容,但这不是官方文档吗? (flask.readthedocs.org 说同样的话)

【问题讨论】:

  • @xbb:我看到了,但我的问题更具体:如何在错误电子邮件中包含 UserAgent(甚至如何访问错误电子邮件的请求对象)?

标签: python flask


【解决方案1】:

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

使用它,我能够收到发送给自己的电子邮件以获取错误日志。

【讨论】:

    【解决方案2】:

    我认为您的答案只需点击一下文档即可。查看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 类的任何these 属性。我将不得不继续挖掘,看看是否有办法在设置 mail_handler 的阶段获取全局上下文变量。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多