1

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

我正在尝试在运行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传播流程以实现我在这里寻找的内容?

4

1 回答 1

0

看起来一切正常,除了日志记录somemodule.somefunction()将数据发送到错误的地方。

你说somemodule.somefunction()看起来像

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

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

于 2012-05-08T15:55:27.067 回答