ete*_*ode 5 python logging sentry raven
我有一个普通的python(非Django)项目,我试图将Raven绑定到日志设置中.
在我们当前的设置下,我们使用简单的日志配置:
import logging
logging.basicConfig(format='long detailed format',
level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
然后将输出重定向到日志文件; 这会生成一个很好的,详细的日志,我们可以在需要时查看.
我们现在想要添加Raven的错误日志记录,将其绑定到我们当前的日志记录设置中,这样logging.error调用也会导致消息被发送到Sentry服务器.使用以下代码:
from raven import Client
from raven.conf import setup_logging
from raven.handlers.logging import SentryHandler
raven = Client(environ.get('SENTRYURL', ''), site='SITE')
setup_logging(SentryHandler(raven, level=logging.ERROR))
Run Code Online (Sandbox Code Playgroud)
错误正在成功发送到Sentry,但我现在只获得一行文件输出:
DEBUG: Configuring Raven for host: <DSN url>
Run Code Online (Sandbox Code Playgroud)
所有其他文件输出 - 从- logging.debug到logging.error- 被抑制.
如果我评论该setup_logging行,我得到文件输出但没有Sentry错误.我究竟做错了什么?
事实证明这是一个草率代码的情况。我们在启动执行路径的其他地方进行了一些修改,重新初始化了日志记录:
logging.root.removeHandler(logging.root.handlers[0]) # Undo previous basicConfig
logging.basicConfig(format='same long format',
level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
但是,由于logging.basicConfig如果存在现有处理程序则不会执行任何操作logging.root,因此这只是删除了流处理程序,留下了哨兵处理程序,并导致basicConfig随后充当空操作,这意味着我们完全丢失了 StreamHandler。
删除这些线路并只使用一根basicConfig和一个setup_logging电话就可以了。