Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用multiprocessing.Queue()时记录传播_Python_Logging_Multiprocessing - Fatal编程技术网

Python 使用multiprocessing.Queue()时记录传播

Python 使用multiprocessing.Queue()时记录传播,python,logging,multiprocessing,Python,Logging,Multiprocessing,我不确定自己是做错了什么,还是只是误解了日志的工作原理。 我试图在运行多处理.Queue()的实例时使用日志记录。我在if\uuuuuuu name\uuuuuu==“\uuuuuu main\uuuuu”模块中设置了一个root\u记录器实例:块,如下所示: if __name__ == "__main__": root_logger = logging.getLogger() hndlr = logging.FileHandler(filename='root_logger.

我不确定自己是做错了什么,还是只是误解了日志的工作原理。

我试图在运行
多处理.Queue()
的实例时使用日志记录。我在
if\uuuuuuu name\uuuuuu==“\uuuuuu main\uuuuu”模块中设置了一个
root\u记录器
实例:
块,如下所示:

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)
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)
def somefunction(filename):
    log.info('Doing something to %s' % filename)
并通过
多处理获取对多处理记录器的引用。获取记录器()

然后,在我的worker进程中,我设置了另一个类似这样的记录器:

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)
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)
def somefunction(filename):
    log.info('Doing something to %s' % filename)
其中
somemodule.somefunction()
如下所示:

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)
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)
def somefunction(filename):
    log.info('Doing something to %s' % filename)
我想看到的是:
  • 来自
    root\u logger
    (root\u logger.log)的日志文件应该包含在
    中执行的任何内容的输出,如果
    块中的名称
  • root\u logger
    中的日志文件还应包含来自多处理程序包的任何输出
  • 唯一的工作日志文件(worker_yyyyjjhhmmss.log)应包含对
    worker.logger
    的调用的所有日志输出以及任何调用的输出(在本例中为
    somefunction()
  • root\u logger
    的日志文件最好只包含对
    Worker.logger.warning()
    或更高版本的调用的输出,但这不是必需的
我现在看到的是:
  • root\u logger的日志文件正确地包含
    中执行的所有内容的输出,如果
    name\uuuuuuu==“\uuuuu main\uuuu”:
  • root\u logger中的日志文件正确地包含了由
    多处理返回的记录器实例的输出。get\u logger()
  • root\u logger中的日志文件不正确地包含
    somemodule.somefunction()
    中包含的记录器实例的输出
  • 唯一的worker日志文件(worker_yyyyjjhhmmss.log)正确包含调用
    worker.logger的输出
  • 工作文件日志不正确不包含对
    somemodule.somefunction()
    中记录器实例的调用的输出

是否可以通过某种方式修改
日志记录
传播流,以实现我在这里寻找的目标?

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

您说
somemodule.somefunction()
看起来像

def somefunction(filename):
    log.info('Doing something to %s' % filename)
由于
log
未在函数中定义,我希望它是在模块级别定义的。这意味着模块级的任何记录器都将是数据发送的地方。如果您的代码与我的代码类似,那么模块级记录器将设置为向根记录器发送数据。您可能需要传入特定的日志实例(即
Worker.logger
)并使用该实例