raven과 getsentry를 사용하여 django에서 메시지를 로깅하지만 로깅이 코드 실행을 지연시키는 것 같습니다. 예를 들어Django Raven Very Slow
# ...view code
tic = datetime.datetime.now()
logging.warning('foo warning')
toc = datetime.datetime.now()
print "log time %s, %s, %s" % (tic, toc, (toc - tic).total_seconds())
# more view code...
출력을 제공한다 :
가이 600ms의 경우에 의한 코드의 실행을 지연시키는 것, 즉log time 2013-09-25 12:03:56.541091, 2013-09-25 12:03:57.139420, 0.598329
. 이게 뭔가 기대 되는가? 메인 코드가 지연되지 않도록 메시지가 별도의 스레드에서 비동기로 보내 졌을 것이라고 생각했을 것입니다. 또한 app.getsentry.com에 대한 핑 시간은 125ms이므로 메시지가 동기화 되어도 600ms가 여전히 이상하게 보입니다. 일을 더 빨리하기 위해 변경할 수있는 설정이 있습니까?
설정 파일 :
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'handlers': {
'sentry': {
'level': 'INFO',
'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
},
},
'loggers': {
'': {
'handlers': ['sentry'],
'level': 'INFO',
'propagate': True,
},
}
}
=== 편집 ===
감사 필립 Dupanović에 스레딩 + 프로토콜을 지적. 슬프게도, 그들은 부팅 노동자 동안 복사되는 스레드 때문에 gunicorn에서 나를 위해 일하지 않았다.
import logging
from raven.contrib.django.handlers import SentryHandler
from raven.transport.threaded import ThreadedHTTPTransport
def post_fork(server, worker):
LOG = logging.getLogger()
for handler in LOG.handlers:
if isinstance(handler, SentryHandler):
for url, transport in handler.client._registry._transports.items():
if isinstance(transport, ThreadedHTTPTransport):
if hasattr(transport, '_worker'):
server.log.info("deleting sentry thread worker attribute")
delattr(transport, '_worker')
else:
server.log.info("sentry thread worker not present, nothing to do.")
OBV이 해킹이며 나를 위해 작동하는 동안은 다른 곳에서도 작동하는지 나는 아무 생각이 다음과 같이 나는 gunicorn 설정 파일에 post_fork 후크를 추가하여 해결했습니다.