日志消息的时间顺序是否有保证?

7
我正在使用logging模块记录应用程序服务器的消息。具体来说,我使用StreamHandler将消息记录到stdout/stderr,并使用Supervisord将这些消息记录到文件中(因为服务器进程受Supervisord监视)。
我的主要问题是,日志文件中的消息顺序是否始终真实反映了代码执行的顺序?例如,如果日志文件中的消息A:this is log msg A出现在消息B:this is log msg B之前,那么即使两个消息的时间戳相同,我们是否可以100%确定记录消息A的代码行在记录消息B的代码行之前被执行?

2
你是否在运行单线程?那么是的,日志条目将按照代码发出的顺序输入到文件中。使用线程时,锁定会起作用,先获得锁定的线程获胜。即使如此,来自同一线程的日志消息永远不会按不同顺序写出,它们只会与其他线程的消息交织在一起。 - Martijn Pieters
@MartijnPieters 谢谢!有用的信息。您知道是否有任何模块/工具可以确保消息按时间顺序排列吗? - Amit Tripathi
@AmitTripathi:请定义“按时间顺序”。如果两个线程同时记录,则首先获取锁的线程将首先记录。然后,条目仍按时间顺序输入(输掉锁投掷的线程必须等待片刻才能成功完成记录)。 - Martijn Pieters
1个回答

4

你不能100%确定,但我很确定。

虽然logging模块在写入文件之前会锁定输出文件,但如果您运行多个线程或进程,则无法保证在大约相同的时间内调用logging.warning("A")或其他内容的代码实际获取锁定,因为有几个其他线程也在尝试做同样的事情。

另请参阅logging文档其源代码。我们可以看到它使用了threading.RLock,关于此的文档说:

如果有多个线程被阻塞等待锁定解除, 那么只有一个线程能够同时拥有该锁定。在这种情况下,没有返回值。

我们无法完全确定哪个线程首先获取锁定,这就是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接