小智 5
如果从不同线程调用相同的处理程序,则它是线程安全的。我将针对这个问题稍微扩展一下。事实上,这取决于你如何使用该logging模块。多线程登录时仍然存在一些非线程安全的情况。
如果多个线程使用不同的记录器实例(例如,logging.getLogger()在每个线程中调用不同的名称),并且这些记录器实例拥有自己的FileHandler 指向同一文件的实例,则会导致竞争条件,从而不再是线程安全的。
此外,如果不同线程中的多个记录器实例持有自己的RotatingFileHandler或TimedRotatingFileHandler,当它们指向同一文件时(即,在实例化它们时给出相同的文件名),它们旋转文件的逻辑也不是线程安全的。当他们需要旋转文件时,可能会发生奇怪的事情。(您可以参考问题Python TimedRotatingFileHandler - messages is Missing,这是由类似的原因引起的)
在模块中,logging每个处理程序实例都持有一个threading.RLock实例,因此持有不同处理程序的不同记录器将持有不同的RLocks,因此当记录器尝试在不同线程中写入同一文件时,这些锁无法避免竞争条件 - 记录器即使他们已经获得了自己的RLock.
您可以参考Logging Cookbook - Opening the same log file multiple times部分以获取更多信息。