如何收集和排序多进程的日志输出

时间:2019-06-17 14:18:30

标签: python python-3.x logging multiprocessing python-multiprocessing

我有一个用Python编写的CLI工具,该工具可处理大量文件并利用进程进行小文件操作。虽然作为线程执行的部分只是较长文件流中的子部分,但线程操作的日志记录输出(显然)是异步的。

我的想法是将所有日志记录输出缓存在内存中(这是非常有限的输出),直到进程完成为止,然后在将其实际输出到STDERR之前,按进程ID对所有日志记录进行排序。我了解日志记录教程的大部分内容,但这有点麻烦。我尝试使用MemoryHandler,但对于如何实现自定义刷新条件或为什么它需要目标Handler本身并没有多大意义。

这段代码说明了我的基本问题:

logger = logging.getLogger()
logger.handlers = []
logging.basicConfig(format='%(levelname)s %(process)s: %(message)s',
                    level=logging.DEBUG)

def work():
    for i in range(5):
        logging.debug(str(i))
        time.sleep(random())

if __name__ == "__main__":
    processes = []
    for i in range(3):
        p = Process(target=work)
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

同步输出类似于:

DEBUG 64571: 0
DEBUG 64572: 0
DEBUG 64573: 0
DEBUG 64572: 1
DEBUG 64572: 2
DEBUG 64572: 3
DEBUG 64572: 4
DEBUG 64573: 1
DEBUG 64571: 1
DEBUG 64573: 2
DEBUG 64573: 3
DEBUG 64573: 4
DEBUG 64571: 2
DEBUG 64571: 3
DEBUG 64571: 4

我希望在进程运行时停止控制台输出,而不是此输出,然后输出按进程ID排序的日志,最好是在下一个优先进程完成后立即输出。

我主要是在寻找概念上要做的事情以及哪些模块和方法可能对此有用。对于我的代码,我的主要问题是:

a)我该如何使用MemoryHandler来存储输出,一旦处理完成,如何格式化它?还是这根本不是一个可行的想法? b)如何监视一个或一个或全部完成的进程(我猜后面的只是p.join()循环之后的代码)? c)在我孤立的示例之外,如何在我的代码中使用多线程的部分之前和之后打开“过程排序”登录。

感谢任何指针;)

0 个答案:

没有答案