主进程日志未写入文件:含ProcessPoolExecutor的多进程日志配置疑问
问题原因
主进程的日志没有写入文件,核心原因是主进程未配置QueueHandler:你的代码里仅给子进程和进程池配置了日志转发到队列的逻辑,但主进程自身没有把日志导向main_logging_queue,导致主进程日志只会走默认输出(如控制台),无法进入监听进程处理并写入文件。
解决方案
在主进程启动监听进程后,立即调用configure_logging_for_multiprocessing函数,把主进程的日志也转发到队列。修改if __name__ == '__main__':部分的代码如下:
if __name__ == '__main__': main_logging_queue = multiprocessing.Manager().Queue() # 启动监听进程 lp = multiprocessing.Process(target=main_process_listener, args=(main_logging_queue,)) lp.start() # 关键:配置主进程日志,将日志发送到监听队列 configure_logging_for_multiprocessing(main_logging_queue) logging.getLogger('main_1').log(choice(LEVELS), 'main process 1') # 启动工作进程 workers = [] for i in range(NUMBER_OF_WORKERS): worker = multiprocessing.Process(target=worker_process, args=(main_logging_queue,)) workers.append(worker) worker.start() # 主进程日志消息(修正原重复内容,方便区分) logging.getLogger('main_2').log(choice(LEVELS), 'main process 2') # 等待所有工作进程结束 for w in workers: w.join() main_logging_queue.put_nowait(None) lp.join()
额外说明
- 配置后,主进程的所有日志会和子进程日志一样,通过队列转发到监听进程,由监听进程统一写入文件,保持格式一致。
configure_logging_for_multiprocessing中设置了root日志级别为DEBUG,若需要调整主进程日志级别,可单独给特定logger设置(如logging.getLogger('main_1').setLevel(logging.INFO))。- 原代码中
main_2的日志内容重复了main process 1,建议改成main process 2便于测试时区分。
内容的提问来源于stack exchange,提问作者laurapons
相关产品推荐
相关产品推荐

