Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何向Sentry报告当前登录的用户?_Python_Sentry_Raven - Fatal编程技术网

Python 如何向Sentry报告当前登录的用户?

Python 如何向Sentry报告当前登录的用户?,python,sentry,raven,Python,Sentry,Raven,我在面向用户的Python/Pyramid webapp上使用Sentry(Raven 3.4.1)。Sentry似乎有能力跟踪哪些用户以及有多少用户遇到了某种异常。(例如,请参阅,其中提到:“记录了用户数据的流现在将显示发生事件的唯一用户数。”) 我如何将这些信息提供给Raven,让它出现在哨兵中 只有手动将异常传递给Raven,才能执行此操作吗?现在,我正在使用连接到根记录器的SentryHandler日志处理程序,以及PasteDeploy管道中的egg:raven#raven过滤器。(紧

我在面向用户的Python/Pyramid webapp上使用Sentry(Raven 3.4.1)。Sentry似乎有能力跟踪哪些用户以及有多少用户遇到了某种异常。(例如,请参阅,其中提到:“记录了用户数据的流现在将显示发生事件的唯一用户数。”) 我如何将这些信息提供给Raven,让它出现在哨兵中

只有手动将异常传递给Raven,才能执行此操作吗?现在,我正在使用连接到根记录器的
SentryHandler
日志处理程序,以及PasteDeploy管道中的
egg:raven#raven
过滤器。(紧跟着这位官员。)

是否有一个好的技巧可以将这些信息传递给Raven?一旦我加载了用户的会话,Raven就会自动获取它,我可以在堆栈底部的某个地方设置一个具有特定名称的局部变量吗?这里的最佳实践是什么


我怀疑这与我正在尝试做的事情有关,但我在Raven文档中找不到任何相关信息。

我找到的唯一方法是覆盖Raven的一些内部方法

基本思想是,我们想修改Raven的
Sentry
类上的
handle\u exception()
方法。在那里,我可以注入我在问题中已经提到的
sentry.interfaces.User
接口。 要做到这一点,我需要我自己的过滤器工厂,然后我可以使用它来代替Raven附带的默认粘贴过滤器,它使用我自己的
Sentry
子类

在我的项目中,我有一个文件
sentry.py

from raven.middleware import Sentry
from raven.utils.wsgi import get_current_url, get_headers, get_environ
from raven.base import Client

def sentry_filter_factory(app, global_conf, **kwargs):
    """ Overwritten just to override the 'Sentry' class being used. """ 
    client = Client(**kwargs)
    return UserEnhancedSentry(app, client)

class UserEnhancedSentry(Sentry):
    """ Overriding raven.middleware.Sentry's handle_exception() method to inject
        the sentry.interfaces.User interface. This relies on the data previously
        being injected into the environ by our custom tween. """
    def handle_exception(self, environ):
        data={}
        data['sentry.interfaces.Http'] = {
            'method': environ.get('REQUEST_METHOD'),
            'url': get_current_url(environ, strip_querystring=True),
            'query_string': environ.get('QUERY_STRING'),
            # TODO
            # 'data': environ.get('wsgi.input'),
            'headers': dict(get_headers(environ)),
            'env': dict(get_environ(environ)),
        }
        if environ.has_key('myapp.user'):
            user_id, username, email = environ.get('myapp.user')
            ip_address = environ.get('HTTP_X_FORWARDED_FOR', environ.get('REMOTE_ADDR'))
            data['sentry.interfaces.User'] = {
                'id': user_id,
                'username': username,
                'email': email,
                'ip_address': ip_address,
            }
        event_id = self.client.captureException(data=data)
        return event_id
在my
setup.py
中,我将过滤器工厂声明为入口点:

entry_points = """\
[paste.app_factory]
main = myapp:main
[paste.filter_app_factory]
raven = myapp.sentry:sentry_filter_factory
""",
现在,我可以使用入口点在我的configuration.ini文件中声明一个过滤器,并将其集成到粘贴管道中,如下所述:

因此,现在,每当Sentry过滤器捕捉到异常时,它不仅会存储有关HTTP请求的数据,而且还会存储有关用户的数据,假设它可以在
环境中找到有关该异常的信息。我现在要做的就是从那里的会话中注入用户信息,我正在使用一个自定义tween:

def sentry_user_tween_factory(handler, registry):
    """ Returns a tween that does nothing but enhance the environ by information about the currently
        logged in user, which will be useful for the Sentry report in case there's an exception """ 
    def sentry_user_tween(request):
        user = request.session.get('user')
        if user:
            request.environ['myapp.user'] = (user.token, user.name, user.email)
        else:
            request.environ['myapp.user'] = (0, 'anonymous', None)
        # proceed with the next tween/handler
        response = handler(request)
        return response
    return sentry_user_tween

config.add_tween('myapp.sentry_user_tween_factory')

这一切似乎过于复杂,但我很高兴终于找到了一种方法让它工作起来。

返回一个错误:LookupError:main节的节名['app:main'、'pipeline:main'](前缀为'app'或'application'或'composite'或'composite'或'pipeline'或'filter-app')可在配置..../development中找到。ini@PaulYin这是你犯的错误吗?听起来似乎与上述内容无关。显然,在PYTHONPATH中有多个“main”部分,但没有指定在development.ini中引用哪个部分。如果这对你没有帮助,请打开一个新的问题!
def sentry_user_tween_factory(handler, registry):
    """ Returns a tween that does nothing but enhance the environ by information about the currently
        logged in user, which will be useful for the Sentry report in case there's an exception """ 
    def sentry_user_tween(request):
        user = request.session.get('user')
        if user:
            request.environ['myapp.user'] = (user.token, user.name, user.email)
        else:
            request.environ['myapp.user'] = (0, 'anonymous', None)
        # proceed with the next tween/handler
        response = handler(request)
        return response
    return sentry_user_tween

config.add_tween('myapp.sentry_user_tween_factory')