使用多处理时记录传播.Queue()

时间:2012-05-04 22:00:36

标签: python logging multiprocessing

我不确定自己是做错了什么,或者我只是误解了日志记录的工作方式。

我正在尝试在运行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传播流量来实现我在这里寻找的目标?

1 个答案:

答案 0 :(得分:0)

除了somemodule.somefunction()的日志记录将数据发送到错误的位置外,一切正常。

你说somemodule.somefunction()看起来像是

def somefunction(filename):
    log.info('Doing something to %s' % filename)

由于函数中未定义log,我希望它是在模块级别定义的。这意味着无论模块级别的任何记录器都是数据发送的位置。如果您的代码与我的代码类似,则设置该模块级记录器以将数据发送到根记录器。您可能需要传入特定的日志记录实例(即Worker.logger)并改为使用它。