使用raven和sentry在Django中记录日志

11

我可能有点晚上了这趟车,但我想在Django中使用Sentry和Raven进行日志记录。

我已经将Sentry和Raven设置到了某个程度,我运行了Raven的测试,它可以正常工作。

现在我想将我的调试信息发送到Sentry,但我该如何做呢?

settings.py

RAVEN_CONFIG = {
    'dsn': 'http://code4@mydomain:9000/2',
    # If you are using git, you can also automatically configure the
    # release based on the git info.
    'release': raven.fetch_git_sha(BASE_DIR),
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'sentry': {
            'level': 'WARNING',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        },
        'console': {
            'level': 'WARNING',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['sentry'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['sentry'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['sentry'],
            'propagate': False,
        },
    }
}

视图.py

import logger
from raven.contrib.django.models import get_client


client = get_client()
client.captureException()

logger = logging.getLogger(__name__)



def my_view(request):

   [...]
    logger.error('There was some crazy error', exc_info=True, extra={
    # Optionally pass a request and we'll grab any information we can
    'request': request,
    })
    [...]
在这一点上,它只记录错误和异常,但无法将此错误消息发送给我...
如何正确使用raven和sentry?文档完全没有帮助,我的谷歌foo也没能找到答案。有什么提示或有用的教程吗?

通常在Sentry中,DEBUG日志记录并不实用。当有人表示他们需要这个功能时,我们会强烈反对,因为通常他们没有理解Sentry的工作原理。如果您可以接受Sentry的限制,或者您有一个非标准的情况,需要使用DEBUG级别来记录重要的错误数据,那么这是可以的。 - David Cramer
好的,感谢澄清 - 我尝试按照 https://docs.getsentry.com/hosted/clients/python/integrations/django/ 进行操作,虽然异常处理非常好用,但是与日志记录的集成方面的设置没有成功 - 完全有可能是我误解了该部分和/或它不是主要用例,但我认为如果配置在我的设置中起作用那就太好了。 - Maximilian Kindshofer
1个回答

15

您已定义了3个日志记录器:djangoravensentry.errors。当您调用logging.getLogger(__name__)时,实际上创建了一个“丢弃的”日志记录器,因为您的___name__与上述任何一个都不匹配。

您应该使用raven日志记录器...

logger = logging.getLogger('raven')
logger.debug('Hola!')

...或者设置你自己的:

LOGGING = {
    # ...
    'loggers': {
        # ...
        'yourapp': {
            'level': 'debug',
            'handlers': ['sentry'],
            'propagate': False,
        },
    }
}

然后在yourapp/views.py中:

logger = logging.getLogger(__name__)
logger.debug('Hola!')

谢谢您的回答 - 但不知何故它仍然无法工作。我将记录器设置为“raven”,但它无法将其消息发送到sentry。 - Maximilian Kindshofer
抱歉,但是上述配置在我的环境中完全正常。我已经从真实代码中整理出了一个要点,请看:https://gist.github.com/alexmorozov/b1fd5a8cd292b64998c3 。也许你的设置没有被重新加载? - Alex Morozov
太棒了!让我们搞清楚是什么原因使答案完整。是INSTALLED_APPS的添加还是LOGGING中的“root”部分? - Alex Morozov
我认为是LOGGING部分和getLogger中的名称,可能需要一些时间才能将消息传输到Sentry。然后日志级别必须至少与处理程序指定的级别一样高。而且文档中没有提到这一点(或者我没有找到)。 - Maximilian Kindshofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接