如何为django项目发送异常到sentry

uqcuzwp8  于 2023-03-20  发布在  Go
关注(0)|答案(5)|浏览(442)

Sentry Django guide之后,我设置了我的项目并部署了它。
因此,我使用SENTRY_DSN值和release值配置RAVEN_CONFIG,并将raven.contrib.django.raven_compat包含在我的INSTALLED_APPS中。
我已经确认,使用此配置,以下命令将在sentry中正确生成消息。

python manage.py raven test

然而,我创建了下面的django视图来引发一个异常,作为另一种确认sentry是否工作的方法,当我点击这个视图时,我得到了一个500的响应,但是sentry中什么也没有显示。

  • 应用程序1/views.py*
def error(request):
    x = 1/0  # error for sentry testing

我的期望是,在django中发生的任何异常(包括500个错误)都将被发送到sentry,而不需要使用日志记录。
我对raven sentry配置的理解是错误的吗?或者,我需要配置其他的东西吗?
我正在使用django的日志设置,但目前我并不关心这些消息是“错误”还是其他的,我目前的主要目标是捕捉并发送任何异常到sentry。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': '{asctime} [{levelname:5}] ({name}) {funcName}: {message}',
            'style': '{',
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'standard',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': DJANGO_CORE_LOG_LEVEL,  # Change to DEBUG to see db queries
        },
        'app1': {
            'handlers': ['console'],
            'level': DJANGO_LOG_LEVEL,
            'propagate': True,
        },
        'app2': {
            'handlers': ['console'],
            'level': DJANGO_LOG_LEVEL,
            'propagate': True,
        }
    },
}

更新

我已经设法让app1.views.error视图在本地使用 runserver 时向sentry报告错误,但在更新配置并部署后,它在部署时仍然不工作。

moiiocjp

moiiocjp1#

从哨兵那里

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'root': {
    'level': 'WARNING',
    'handlers': ['sentry'],
},
'formatters': {
    'verbose': {
        'format': '%(levelname)s  %(asctime)s  %(module)s '
                  '%(process)d  %(thread)d  %(message)s'
    },
},
'handlers': {
    'sentry': {
        'level': 'ERROR', # To capture more than ERROR, change to WARNING, INFO, etc.
        'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        'tags': {'custom-tag': 'x'},
    },
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'verbose'
    }
},
'loggers': {
    'django.db.backends': {
        'level': 'ERROR',
        'handlers': ['console'],
        'propagate': False,
    },
    'raven': {
        'level': 'DEBUG',
        'handlers': ['console'],
        'propagate': False,
    },
    'sentry.errors': {
        'level': 'DEBUG',
        'handlers': ['console'],
        'propagate': False,
    },
},

}
链接到文档:https://docs.sentry.io/clients/python/integrations/django/
编辑:来自评论

try:
    do something
except Exception:
    from raven.contrib.django.raven_compat.models import client
    client.captureException()

如果你不想手工做这个,并且想在你的项目中任何地方触发异常块的任何时候都发生哨兵日志记录,那么使用上面的基于日志记录的解决方案。

jecbmhm3

jecbmhm32#

只是想确认一下其他的答案都过时了。
raven库已经被sentry-sdk取代了,并且设置这个库不再需要修改日志配置,因为默认的日志集成已经可以监视任何日志调用。
就这么做

import sentry_sdk.integrations.django

sentry_sdk.init(
    integrations=[sentry_sdk.integrations.django.DjangoIntegration()],
)

在您的www.example.com中settings.py,您就可以开始了(记得导出一个SENTRY_DSN变量之类的东西)。
请参见https://docs.sentry.io/platforms/python/guides/django/#configure

x7rlezfr

x7rlezfr3#

Updated Sentry documents提到,有了Django集成,您不需要在settings.py中显式定义LOGGER:

import logging

logging.error("Test error event", extra=dict(bar=43))
kpbwa7wx

kpbwa7wx4#

正如@Mehran所说,在settings.py中配置了LOGGING之后,您将能够使用日志记录。让我们假设您在loggers中配置了example,如下所示:

'loggers': {        
    'example': {
        'handlers': ['console', 'sentry'],
        'level': 'DEBUG',
        'propagate': False
    }
}

然后;

import logging

logger = logging.getLogger("example")

def test():
    try:
       # some staff
    except Exception as error:
       logger.error("Custom Error Message %s" %error)

logger还具有warninfo等。

bcs8qyzn

bcs8qyzn5#

也可以不使用任何Sentry库而使用纯requests直接发布到Sentry DSN。如果你运行的Python或Django版本与Sentry的最新DSN不兼容,这会很有用。
我已经发布了一个代码-包括一个示例测试-here

相关问题