2

我正在尝试应用pybrake针对 Airbrake 的 Python 异常通知器描述的 Django 集成步骤。Django 项目包含多个应用程序,其中一个名为lucy_web. 在我的设置中,我定义了AIRBRAKE这样的设置:

AIRBRAKE = dict(
    project_id=os.getenv('AIRBRAKE_API_KEY'),
    project_key=os.getenv('AIRBRAKE_PROJECT_ID'),
    environment=os.getenv('AIRBRAKE_ENVIRONMENT', default='production'),
    root_directory=os.path.dirname(os.getcwd()))

LOGGING设置是:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': os.environ.get('LOG_LEVEL', 'ERROR'),
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'airbrake': {
            'level': 'ERROR',
            'class': 'pybrake.LoggingHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': os.environ.get('LOG_LEVEL', 'ERROR'),
            'handlers': ['console'],
        },
        'lucy_web': {
            'handlers': ['airbrake'],
            'level': 'ERROR',
            'propagate': True,
        }
    }
}

请注意,我已将'app'README 中的键替换'lucy_web'为项目中应用程序之一的名称。

现在,正如我从 Python 的日志记录文档(https://docs.python.org/3/library/logging.html)中了解到的那样,任何Logger名称为 like 的对象'lucy_web.foo.bar'都应该传播到'lucy_web'记录器并由其处理程序处理,该处理程序已定义以上为pybrake.LoggingHandler.

为了测试这一点,我尝试了以下测试lucy_web/tests/test_airbrake.py

import os
import logging
import pybrake
from django.test import SimpleTestCase

logger = logging.getLogger(__name__)


class AirbrakeTest(SimpleTestCase):
    def test_1(self):
        notifier = pybrake.Notifier(
            project_id=os.getenv('AIRBRAKE_PROJECT_ID'),
            project_key=os.getenv('AIRBRAKE_PROJECT_KEY'),
            environment='production',
            root_directory=os.path.dirname(os.getcwd()))

        try:
            raise ValueError("Hello")
        except Exception as err:
            notifier.notify(err)

    def test_2(self):
        logger.error("Foobar")

第一个测试是一种更“冗长”的方法,其中 apybrake.Notifier被直接实例化。从我们的 Airbrake 仪表板可以看出,这成功地向 Airbrake 发送了一个错误:

在此处输入图像描述

但是,依赖于日志记录集成的第二个测试似乎没有向 Airbrake 发送任何通知。这不应该是它应该如何工作吗?

4

0 回答 0