我正在尝试应用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 发送任何通知。这不应该是它应该如何工作吗?