我不确定自己是做错了什么,或者我只是误解了日志记录的工作方式。
我正在尝试在运行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.logger
的调用的所有日志记录输出以及来自任何调用的输出(在本例中为somefunction()
)root_logger
的日志文件只包含调用Worker.logger.warning()
或更高版本的输出,但这不是必须的。root_logger
正确的日志文件包含if __name__ == "__main__":
块中执行的所有内容的输出。root_logger
正确的日志文件包含multiprocessing.get_logger()
返回的记录器实例的输出。root_logger
错误的日志文件包含somemodule.somefunction()
中包含的记录器实例的输出。Worker.logger
的调用的输出。somemodule.somefunction()
中对记录器实例的调用的输出。 是否可以通过某种方式修改logging
传播流量来实现我在这里寻找的目标?
答案 0 :(得分:0)
除了somemodule.somefunction()
的日志记录将数据发送到错误的位置外,一切正常。
你说somemodule.somefunction()
看起来像是
def somefunction(filename):
log.info('Doing something to %s' % filename)
由于函数中未定义log
,我希望它是在模块级别定义的。这意味着无论模块级别的任何记录器都是数据发送的位置。如果您的代码与我的代码类似,则设置该模块级记录器以将数据发送到根记录器。您可能需要传入特定的日志记录实例(即Worker.logger
)并改为使用它。