python logging模块在多进程多日志文件写入时要注意的问题

python logging模块在多进程多日志文件写入时要注意的问题

项目背景

根据需求,父进程负责创建并维护子进程的数量,具体开启的子进程个数为服务器cpu的核心数。子进程负责从redis任务队列中获取任务,并执行任务。子进程在执行任务过程中,需要打印日志到各任务对应的日志文件中(一个任务对应一个日志文件)。

问题描述

进程A在执行任务a时,会创建日志文件a.log,并将执行任务a时的日志输出到a.log文件中,进程A在执行任务a结束后,依次执行任务b、c、d…时,会创建对应的日志文件b.log、c.log、d.log…,并将执行任务b、c、d…时的日志输出到b.log、c.log、d.log…文件中,但是:执行任务b、c、d…时的日志同时也会输出到a.log中,直到a.log文件大小超过设定的日志文件大小,才会停止向a.log写入日志。同上所述,执行任务c、d…的日志也会写入b.log中。。。

问题原因

使用python的logging模块时,需要注意,在进程中,如果切换了新的日志文件,那么logging模块在将日志写入新日志文件的同时,仍然会向原日志文件写入数据。

以下是引自博友l627757940的回复:

这个问题其实是因为即使对logging.getLogger()传入相同的名称也会返回新的Logger实例,而非返回之前已有的同名实例,导致有多个相同名字的Logger实例,解决办法就是在logger类上加入一个字典,用于记录名字和对应的实例,在使用getLogger产生实例之前现对现有实例进行检查,有则返回现有实例,否则生成新的实例并将其记录到字典里即可

解决方案

父进程创建并维护子进程数量,子进程在每次获取到任务并执行完毕后,都要将子进程停掉。如果有新的任务,父进程去创建新的子进程。

你可能感兴趣的:(python)