【问题标题】:Logging propagation while using multiprocessing.Queue()使用 multiprocessing.Queue() 时的日志传播
【发布时间】: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


    【解决方案1】:

    看起来一切正常,只是来自somemodule.somefunction() 的日志记录正在将数据发送到错误的位置。

    你说somemodule.somefunction()看起来像

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2014-02-19
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多