【发布时间】:2020-05-15 11:58:48
【问题描述】:
我有一个Driver.py 脚本,它根据给定的输入调用多个threads。线程基本上是运行选定对象的模块。所以Driver.py 可以调用thread_1.run()、thread_2.run()、thread_3.run(),并继续其进程。
Driver.py 将其输出记录到 main.log 文件夹中,我希望线程在其中将其输出记录到每个文件的唯一文件名中。 Driver.py 和 Threads 还使用在不同文件上定义的通用模块,它们还记录信息。
我首先在Driver 上调用setup_load("main.log"),然后在每个Thread 中调用setup_load(f"thread_{jobid}.log")。我意识到当 Thread 被调用时,现在 Driver.py 写入线程的日志文件。我可能会在 Thread 中使用不同的记录器,但是当 Thread 调用另一个模块时,因为这些通用模块正在使用 import logging,它们会写入根记录器定义的文件名。
=> 是否可以将来自不同线程的消息记录到不同的文件中?我在 SO (for example) 上找到了多个答案,但没有一个涵盖在不同文件上调用另一个模块时,他们如何找出他们可以使用的 logger。
=> 所以我面临的问题是,由于每个线程都使用相同的底层记录器,当我在一个线程中更改 logging.basicConfig 的文件路径时,它会影响整个类线程和驱动程序,因为他们都在使用它。
=> 来自线程或驱动程序调用的不同模块的函数如何理解它应该选择哪个记录器?
How to change filehandle with Python logging on the fly with different classes and imports 的评论部分有讨论和推荐的解决方案。
@Martijn Pieters:
下一个选项:创建每个线程的处理程序,给每个处理程序一个过滤器 过滤日志记录
thread属性。将过滤器附加到任何 其他为thread设置的日志记录返回 False 的处理程序
【问题讨论】: