Python 我应该如何编写记录器代理?

Python 我应该如何编写记录器代理?,python,logging,multiprocessing,python-3.8,Python,Logging,Multiprocessing,Python 3.8,我有一个函数,用于生成一个记录器代理,该代理可以安全地传递给多处理工作人员,并使用以下代码重新登录到主记录器: import logging from multiprocessing.managers import BaseManager class SimpleGenerator: def __init__(self, obj): self._obj = obj def __call__(self): return self._obj def get_logger_prox

我有一个函数,用于生成一个记录器代理,该代理可以安全地传递给多处理工作人员,并使用以下代码重新登录到主记录器:

import logging
from multiprocessing.managers import BaseManager

class SimpleGenerator:
    def __init__(self, obj): self._obj = obj
    def __call__(self): return self._obj

def get_logger_proxy(logger):
    class LoggerManager(BaseManager): pass
    logger_generator = SimpleGenerator(logger)
    LoggerManager.register('logger', callable = logger_generator)
    logger_manager = LoggerManager()
    logger_manager.start()
    logger_proxy = logger_manager.logger()

    return logger_proxy

logger = logging.getLogger('test')

logger_proxy = get_logger_proxy(logger)
这在Python2.7到3.7中非常有效。我可以将生成的
logger\u proxy
传递给工作人员,他们将记录信息,然后这些信息将正确地发送回主
logger

但是,在python 3.8.2(和3.8.0)上,我得到了以下结果:

回溯(最近一次呼叫最后一次):
文件“junk.py”,第20行,在
logger_proxy=获取_logger_proxy(记录器)
文件“junk.py”,第13行,在get\u logger\u proxy中
logger_manager.start()
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/managers.py”,第579行,开始
self.\u进程启动()
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/process.py”,第121行,开始
self.\u popen=self.\u popen(self)
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/context.py”,第283行,在
返回Popen(过程对象)
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/popen_spawn_posix.py”,第32行,在__
super().\uuuu init\uuuj(进程对象)
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/popen_fork.py”,第19行,在__
自启动(过程obj)
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/popen_spawn_posix.py”,第47行,在
减少.转储(处理对象,fp)
文件“/anaconda3/envs/py3.8/lib/python3.8/multiprocessing/reduce.py”,第60行,转储文件
ForkingPickler(文件、协议).dump(obj)
AttributeError:无法pickle本地对象“get_logger_proxy..LoggerManager”
因此,他们似乎改变了ForkingPickler的某些内容,使其无法处理my
get\u logger\u proxy
函数中的闭包


我的问题是,如何在python 3.8中解决这个问题?或者有没有更好的方法来获得一个在python 3.8中工作的记录器代理,就像在以前的版本中一样?

不确定这是否是一个回归,但您可能想在bugs上对此提出一个问题。python.org也可能与此相关,尽管它注意到在3.7中发生的更改感谢您的建议。虽然不确定这是一个回归,但您可能希望在bugs.python.org上对此提出一个问题,也可能是相关的,尽管它注意到3.7中发生的更改感谢您的建议。张贴