【问题标题】:Is chronological order of logging messages guaranteed?记录消息的时间顺序是否得到保证?
【发布时间】:2013-05-03 10:17:28
【问题描述】:

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

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

【问题讨论】:

  • 你在运行单线程吗?然后是的,日志条目将按照代码发出的顺序输入到文件中。使用线程,锁定开始发挥作用,首先拥有锁定的线程获胜。即使这样,来自同一线程的日志消息也永远不会以不同的顺序写出,它们只会与来自其他线程的消息混合在一起。
  • @MartijnPieters 谢谢!有用的信息。您知道任何确保消息按时间顺序排列的模块/工具吗?
  • @AmitTripathi:按时间顺序定义。如果两个线程同时记录,那么第一个获得锁的线程将首先记录。然后仍然按时间顺序输入条目(丢失锁的线程必须等待片刻才能成功完成日志记录)。

标签: python logging supervisord


【解决方案1】:

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

虽然日志记录模块在写入输出文件之前会锁定它,但如果您正在运行多个线程或进程,则无法保证调用 logging.warning("A") 的代码或其他线程尝试执行的任何实际获取锁定的代码大约在同一时间。

另见docs for loggingits source。我们看到它使用threading.RLockthe docs 说:

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

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

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2021-01-27
    • 2019-11-15
    • 1970-01-01
    • 2014-09-29
    • 2015-09-06
    • 2015-10-03
    相关资源
    最近更新 更多