首页 > 解决方案 > 为什么 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

当 worker 接收到一个作业时,它只是在 log 语句之后停止执行,不会引发异常:

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

编辑:另一个有趣的难题是sys.excepthook在工作人员上下文中没有调用。

标签: pythonloggingredispython-rq

解决方案


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

推荐阅读