Почему RQ не вызывает исключения после logging.config.dictConfg?
Я хотел бы использовать logging.config.dictConfig
в моем RQ работника. Но я обнаружил, что после запуска dictConfig()
рабочий больше не будет вызывать исключения, которые не будут работать в производстве.
Вот мой рабочий код:
import logging
import logging.config
config = {
'version': 1,
'disable_existing_loggers': True,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
'level': 'DEBUG'
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console']
}
}
logging.config.dictConfig(config)
log = logging.getLogger('test')
def raises():
'''This is the worker function'''
log.info('running raises')
raise RuntimeError
Когда работник получает задание, он просто приостанавливает выполнение после оператора журнала, без каких-либо исключений:
12:28:09 log-test: log_test.raises() (d59ad742-4dcd-4d4f-84e2-6f747c21d603)
running raises
РЕДАКТИРОВАТЬ: Еще одна интересная часть головоломки является то, что sys.excepthook
не вызывается в рабочем контексте.
1 ответ
Оказывается, что RQ довольно тесно связан с его настройкой регистрации. На самом деле, Worker
класс содержит экземпляр Logger
-- когда dictConfig
называется, ссылки на этот логгер ломаются.
Решение было включить rq.worker
регистратор в моем конфиге:
config = {
'version': 1,
'formatters': {
'rq': {
'format': '%(asctime)s %(message)s',
'datefmt': '%H:%M:%S'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
'level': 'DEBUG'
},
'rq': {
'class': 'rq.utils.ColorizingStreamHandler',
'formatter': 'rq'
}
},
'loggers': {
'rq.worker': {
'level': 'INFO',
'handlers': ['rq'],
'propagate': False
}
},
'root': {
'class': 'logging.RootLogger',
'level': 'DEBUG',
'handlers': ['console']
}
}