7

我正在使用该logging模块记录来自应用程序服务器的消息。更具体地说,我使用 StreamHandler 将消息记录到 stdout/stderr,并使用Supervisord将这些消息记录到文件中(因为服务器进程由 监控Supervisord)。

我的主要问题是,日志文件中的消息顺序是否总是真实反映代码的执行顺序?例如,如果一条消息A: this is log msg A出现在B: this is log msg B日志文件中的消息之前,那么我们是否可以 100% 确定记录消息的代码行在记录消息A的代码行之前执行B,即使两条消息的时间戳在日志文件是一样的吗?

4

1 回答 1

4

你不能百分百确定,我很确定。

尽管日志记录模块在写入输出文件之前会锁定它,但如果您正在运行多个线程或进程,则无法保证您的代码调用logging.warning("A")或任何实际获取锁定的代码,如果其他几个线程试图在相同的时间做同样的事情时间。

另请参阅日志记录文档及其来源。我们看到它使用threading.RLock文档说:

如果有多个线程被阻塞等待锁被解锁,那么每次只有一个线程能够获取锁的所有权。在这种情况下没有返回值。

我们不能完全确定哪个线程首先获得了锁,这就是问题所在。

于 2013-05-09T03:44:20.620 回答