Python 使用multiprocessing.Queue()时记录传播
我不确定自己是做错了什么,还是只是误解了日志的工作原理。 我试图在运行Python 使用multiprocessing.Queue()时记录传播,python,logging,multiprocessing,Python,Logging,Multiprocessing,我不确定自己是做错了什么,还是只是误解了日志的工作原理。 我试图在运行多处理.Queue()的实例时使用日志记录。我在if\uuuuuuu name\uuuuuu==“\uuuuuu main\uuuuu”模块中设置了一个root\u记录器实例:块,如下所示: if __name__ == "__main__": root_logger = logging.getLogger() hndlr = logging.FileHandler(filename='root_logger.
多处理.Queue()
的实例时使用日志记录。我在if\uuuuuuu name\uuuuuu==“\uuuuuu main\uuuuu”模块中设置了一个root\u记录器
实例:
块,如下所示:
if __name__ == "__main__":
root_logger = logging.getLogger()
hndlr = logging.FileHandler(filename='root_logger.log', mode='w')
root_logger.addHandler(hndlr)
root_logger.setLevel(logging.DEBUG)
from somemodule import somefunction
class Worker(object):
def __init__(self, filename):
self.filename = filename
def _log_setup(self):
'''Done outside of init to avoid trying to pickle the logging instance.'''
#Create a unique logger
self.logger = logging.getLogger('Worker_'+self.filename[0:13])
self.logger.setLevel(logging.DEBUG)
#Create a unique log file
hndlr = logging.FileHandler(filename='./' + os.path.basename(self.filename) + '.log', mode='w')
self.logger.addHandler(hndlr)
def __call__(self):
self._log_setup()
self.logger.info('Logged from worker')
somefunction(self.filename)
def somefunction(filename):
log.info('Doing something to %s' % filename)
并通过多处理获取对多处理记录器的引用。获取记录器()
然后,在我的worker进程中,我设置了另一个类似这样的记录器:
if __name__ == "__main__":
root_logger = logging.getLogger()
hndlr = logging.FileHandler(filename='root_logger.log', mode='w')
root_logger.addHandler(hndlr)
root_logger.setLevel(logging.DEBUG)
from somemodule import somefunction
class Worker(object):
def __init__(self, filename):
self.filename = filename
def _log_setup(self):
'''Done outside of init to avoid trying to pickle the logging instance.'''
#Create a unique logger
self.logger = logging.getLogger('Worker_'+self.filename[0:13])
self.logger.setLevel(logging.DEBUG)
#Create a unique log file
hndlr = logging.FileHandler(filename='./' + os.path.basename(self.filename) + '.log', mode='w')
self.logger.addHandler(hndlr)
def __call__(self):
self._log_setup()
self.logger.info('Logged from worker')
somefunction(self.filename)
def somefunction(filename):
log.info('Doing something to %s' % filename)
其中somemodule.somefunction()
如下所示:
if __name__ == "__main__":
root_logger = logging.getLogger()
hndlr = logging.FileHandler(filename='root_logger.log', mode='w')
root_logger.addHandler(hndlr)
root_logger.setLevel(logging.DEBUG)
from somemodule import somefunction
class Worker(object):
def __init__(self, filename):
self.filename = filename
def _log_setup(self):
'''Done outside of init to avoid trying to pickle the logging instance.'''
#Create a unique logger
self.logger = logging.getLogger('Worker_'+self.filename[0:13])
self.logger.setLevel(logging.DEBUG)
#Create a unique log file
hndlr = logging.FileHandler(filename='./' + os.path.basename(self.filename) + '.log', mode='w')
self.logger.addHandler(hndlr)
def __call__(self):
self._log_setup()
self.logger.info('Logged from worker')
somefunction(self.filename)
def somefunction(filename):
log.info('Doing something to %s' % filename)
我想看到的是:
- 来自
(root\u logger.log)的日志文件应该包含在root\u logger
块中的名称中执行的任何内容的输出,如果
中的日志文件还应包含来自多处理程序包的任何输出root\u logger
- 唯一的工作日志文件(worker_yyyyjjhhmmss.log)应包含对
的调用的所有日志输出以及任何调用的输出(在本例中为worker.logger
)somefunction()
的日志文件最好只包含对root\u logger
或更高版本的调用的输出,但这不是必需的Worker.logger.warning()
块root\u logger的日志文件正确地包含
name\uuuuuuu==“\uuuuu main\uuuu”:中执行的所有内容的输出,如果
root\u logger中的日志文件正确地包含了由
多处理返回的记录器实例的输出。get\u logger()
root\u logger中的日志文件不正确地包含
中包含的记录器实例的输出somemodule.somefunction()
- 唯一的worker日志文件(worker_yyyyjjhhmmss.log)正确包含调用
worker.logger的输出
- 工作文件日志不正确不包含对
中记录器实例的调用的输出somemodule.somefunction()
是否可以通过某种方式修改
日志记录
传播流,以实现我在这里寻找的目标?除了从somemodule.somefunction()
进行的日志记录将数据发送到错误的位置外,看起来一切正常
您说somemodule.somefunction()
看起来像
def somefunction(filename):
log.info('Doing something to %s' % filename)
由于log
未在函数中定义,我希望它是在模块级别定义的。这意味着模块级的任何记录器都将是数据发送的地方。如果您的代码与我的代码类似,那么模块级记录器将设置为向根记录器发送数据。您可能需要传入特定的日志实例(即Worker.logger
)并使用该实例