我不确定我是否做错了什么,或者我只是误解了日志记录的工作方式。
我正在尝试在运行multiprocessing.Queue()
. 我在块内的模块中设置了一个root_logger
实例,if __name__ == "__main__":
如下所示:
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)
并通过 获取对多处理记录器的引用multiprocessing.get_logger()
。
然后,在我的工作进程中,我设置了另一个记录器,如下所示:
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)
somemodule.somefunction()
看起来像这样:
def somefunction(filename):
log.info('Doing something to %s' % filename)
我想看到的:
root_logger
(root_logger.log) 中的日志文件应该包含在if __name__ == "__main__":
块中执行的任何内容的输出。- 来自的日志文件
root_logger
还应该包含来自多处理包的任何输出。 - 唯一的工作日志文件 (Worker_YYYYJJJHHMMSS.log) 应包含调用的所有日志记录输出
Worker.logger
以及任何调用的输出(在这种情况下,somefunction()
) - 日志文件最好
root_logger
只包含调用到Worker.logger.warning()
或更高版本的输出,但这不是必须的。
我目前看到的:
- 来自的日志文件
root_logger
正确包含if __name__ == "__main__":
块中执行的所有内容的输出。 - 来自的日志文件
root_logger
正确包含由multiprocessing.get_logger()
. - 来自的日志文件
root_logger
错误地包含来自somemodule.somefunction()
. - 唯一的工作程序日志文件 (Worker_YYYYJJJHHMMSS.log)正确包含对
Worker.logger
. - 工作文件日志错误地不包含调用记录器实例的输出
somemodule.somefunction()
。
是否可以以某种方式修改logging
传播流程以实现我在这里寻找的内容?