Django集成pybrake日志通知失效问题求助
你的test_2依赖日志集成却发不出通知,肯定是配置环节出了问题——正常来说,只要日志配置正确,lucy_web.foo.bar这类子日志器的日志会自动传播到lucy_web根日志器,进而被pybrake的LoggingHandler捕获并发送到Airbrake。我帮你梳理几个最可能的排查点:
检查LOGGING配置的关联关系
你得确认这几点:- 在
LOGGING['handlers']里有没有正确定义pybrake的handler,比如:'handlers': { 'pybrake': { 'level': 'ERROR', 'class': 'pybrake.LoggingHandler', 'notifier': pybrake.Notifier(project_id=..., project_key=..., environment=...), }, # 其他handler... } - 在
LOGGING['loggers']['lucy_web']的handlers列表里有没有包含'pybrake',而且propagate没有被设为False(默认是True,如果手动关掉就会阻断日志传播)。
- 在
确认日志级别是否达标
pybrake的LoggingHandler默认只处理ERROR及以上级别的日志。如果你的test_2里用的是logger.warning()或者logger.info(),那肯定不会触发通知。得改成logger.error()或者logger.exception()(后者会自动附带堆栈信息),或者手动把handler的level改成WARNING。核对日志器的命名是否正确
test_2里获取日志器的方式是不是logging.getLogger(__name__)?在lucy_web应用的模块里,__name__应该是类似lucy_web.views或者lucy_web.utils的格式,这样才会属于lucy_web的子日志器。如果不小心写成了logging.getLogger('app.foo')这种旧名称,那自然不会关联到你的配置。验证Django是否加载了正确的日志配置
有时候如果settings.py里的LOGGING配置写错了(比如语法错误),Django会静默忽略并使用默认配置。你可以在test_2里加一行代码打印日志器的handler列表,确认pybrake的handler是否存在:logger = logging.getLogger('lucy_web.foo.bar') print([h.__class__.__name__ for h in logger.handlers + logger.parent.handlers])如果输出里没有
LoggingHandler,说明配置没生效。
总的来说,只要配置没问题,test_2应该和test_1一样能成功发送通知。你按照上面的步骤排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者Kurt Peek

