为什么RQ在logging.config.dictConfg之后没有引发异常?

时间:2019-03-01 17:32:48

标签: python logging redis python-rq

我想在我的RQ工作人员中使用logging.config.dictConfig。但是,我发现运行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

当工人收到一份工作时,它只是在log语句后停止执行,没有引发异常:

12:28:09 log-test: log_test.raises() (d59ad742-4dcd-4d4f-84e2-6f747c21d603)
running raises

编辑:另一个有趣的难题是,sys.excepthook不在工作环境中被调用。

1 个答案:

答案 0 :(得分:0)

事实证明,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']
    }
}