python - 为什么 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
在工作人员上下文中没有调用。
解决方案
事实证明,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']
}
}