【问题标题】:Django/Raven/Sentry: different loggers for different DSNsDjango/Raven/Sentry:不同 DSN 的不同记录器
【发布时间】:2015-12-07 10:18:48
【问题描述】:

如何配置 Django logging 以支持不同 loggers 的不同 DSN?

类似这样的:

settings.py

  LOGGING = {
    ..
    'handlers': {
        'sentry1': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.handlers.SentryHandler',
            'dsn': '<DSN1>',
        },        
        'sentry2': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.handlers.SentryHandler',
            'dsn': '<DSN2>',
        },
    },
    'loggers': {
        'sentry1':{
            'handlers': ['console', 'sentry1'],
            'level': 'ERROR',
            'propagate': False,
        },
        'sentry2':{
            'handlers': ['console', 'sentry2'],
            'level': 'ERROR',
            'propagate': False,
        },
}

views.py

import logging
logger = logging.getLogger('sentry2')
logger.error('yeey!')

【问题讨论】:

    标签: python django logging sentry raven


    【解决方案1】:

    试试这个对我有用的方法

    1) 编写自定义处理程序

    from __future__ import absolute_import
    
    import logging
    
    from raven.handlers.logging import SentryHandler
    
    
    class CustomHandler(SentryHandler):
        def __init__(self, *args, **kwargs):
            dsn = kwargs.pop('dsn', None)
    
            self.tags = kwargs.pop('tags', None)
    
            logging.Handler.__init__(self, level=kwargs.get('level', logging.NOTSET))
    
            super(CustomHandler, self).__init__(dsn, **kwargs)
    

    2) 更改您的登录设置

    LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s '
                      '%(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'sentry1': {
            'level': 'ERROR',
            'class': 'project.sentry.CustomHandler',
            'dsn': '<DSN1>',
        },
        'sentry2': {
            'level': 'ERROR',
            'class': 'project.sentry.CustomHandler',
            'dsn': '<DSN2>',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'sentry1': {
            'handlers': ['sentry1'],
            'level': 'ERROR',
            'propagate': False,
        },
        'sentry2': {
            'handlers': ['sentry2'],
            'level': 'ERROR',
            'propagate': False,
        },
    }
    }
    

    3) 在任何地方记录您的错误

    import logging
    logger = logging.getLogger('sentry2')
    logger.error('yeey!')
    

    它对我有用,用 python3.6 django2 测试过。

    【讨论】:

    • 我没有测试过这个(当前公司没有 Django),但它对我来说很有意义,因此我接受了答案。谢谢!
    • 为什么需要自定义处理程序?它的作用是什么?
    • 能够为每个处理程序传递特定的 DSN
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2011-08-10
    • 2014-02-28
    • 2020-10-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多