我正在使用logging
模块记录来自应用程序服务器的消息。更具体地说,我使用StreamHandler将消息记录到stdout / stderr,并使用Supervisord
将这些消息记录到文件中(因为服务器进程由Supervisord
监视)。
我的主要问题是,日志文件中的消息顺序是否真实是否反映了代码的执行顺序?例如,如果消息A: this is log msg A
出现在日志文件中的消息B: this is log msg B
之前,那么我们是否可以100%确定记录消息A
的代码行是在行之前执行的记录消息B
的代码,即使日志文件中两条消息的时间戳相同?
答案 0 :(得分:3)
你不能百分百肯定,我很确定。
虽然日志记录模块在写入之前锁定输出文件,但是如果您正在运行多个线程或进程,则无法保证您的代码调用logging.warning("A")
或其他几个线程正在尝试实际获取锁定大约在同一时间做同样的事情。
另请参阅docs for logging和its source。我们看到它使用threading.RLock
,其中the docs说:
如果锁定了多个线程,等待解锁, 只有一个人能够获得锁的所有权。那里 在这种情况下没有返回值。
我们不能完全确定哪个线程首先获得锁定,这就是问题。