Skip to main content
 首页 » 编程设计

python之为什么 Sentry 推荐的 Django 日志记录配置会沉默来自 django.db.backends 的日志记录

2024年09月03日36zengkefu

(现已弃用)Sentry Django 集成文档推荐以下 LOGGING 配置 ( https://docs.sentry.io/clients/python/integrations/django/ ):

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, 
        }, 
    }, 
} 

我对这个记录器定义特别感兴趣:

    'django.db.backends': { 
        'level': 'ERROR', 
        'handlers': ['console'], 
        'propagate': False, 
    }, 

对我来说,这表明源自 django.db.backends(和后代)的日志条目仅发送到控制台,不会传播到根记录器(配置为将日志条目 >= WARNING 发送到 Sentry。

Sentry 文档似乎甚至没有承认这个记录器的存在。此配置按原样呈现,作为让 Django 登录到 Sentry 的一种方式。

  1. 我的解读正确吗?
  2. 你能想出任何理由吗?您似乎想要将 django.db.backends.* >= WARNING 日志条目发送到 Sentry。

请您参考如下方法:

django.db.backends 包含每个 SQL 查询的日志,这是 Django 使用它的唯一目的。据我所知,此命名空间上从未记录过任何警告或错误。

我们想忽略来自 django.db.backends 的日志记录面包屑,因为我们已经有一个自定义 Hook 用于在 Django 中捕获 SQL 查询,这样我们就可以在 UI 中以不同于其他面包屑的方式显示它们。

Raven 将此逻辑卸载给用户,新的 SDK sentry_sdk 在内部忽略了记录器。您可以在此处找到等效项:https://github.com/getsentry/sentry-python/blob/fde5576e489dd7926fce7bae7be8399021cdde14/sentry_sdk/integrations/django/init.py#L365