Почему 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']
    }
}
Другие вопросы по тегам