我登錄使用烏鴉和getsentry Django的消息,但日誌似乎延遲代碼的執行。例如:Django的烏鴉非常慢
# ...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...
給出的輸出:
log time 2013-09-25 12:03:56.541091, 2013-09-25 12:03:57.139420, 0.598329
即它在這種情況下延遲所述代碼的執行由600毫秒。這是可以預料的嗎?我原以爲這個消息會在一個單獨的線程中發送異步,所以主代碼不會被延遲。另外我的ping時間爲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配置文件中添加post_fork鉤如下:
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,這是一個黑客,而我的作品,我不知道是否會工作其他地方。