【发布时间】:2012-05-04 22:00:36
【问题描述】:
我不确定我做错了什么,或者我只是误解了日志记录的工作原理。
我正在尝试在运行 multiprocessing.Queue() 的实例时使用日志记录。我在 if __name__ == "__main__": 块内的模块中设置了一个 root_logger 实例,如下所示:
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 传播流程以实现我在这里寻找的内容?
【问题讨论】:
标签: python logging multiprocessing