2014-04-28 69 views
3

我有Flask安装程序在发生错误时给我发电子邮件,但我想在该电子邮件中包含UserAgent。那可能吗?我没有在The docs看到它。有没有办法在错误日志中包含useragent?

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

+0

可能与http://stackoverflow.com/questions/9878020/how-do-i-get-the-user-agent-with-flask重复 – xbb

+0

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

回答

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', '[email protected]', 
        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) 

使用此功能,我可以收到发送给我自己的错误日志的电子邮件。

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

这可能不是完美的(特别是我的字符串格式化代码),但希望这篇文章点,你在正确的方向。

+0

我收到一个错误:RuntimeError:在请求上下文之外工作 –

+0

有趣的是,在创建日志记录时,您不能访问应用程序全局变量。您至少可以获得LogR​​ecord类的任何[这些](https://docs.python.org/dev/library/logging.html#logging.LogRecord)属性。我将不得不继续挖掘,看看是否有办法在设置mail_handler的阶段获取全局上下文变量。 – voteblake

相关问题