gpt4 book ai didi

ruby - Ruby 的 stdlib Logger 类能否安全地处理来自多个进程的编写器?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:32 25 4
gpt4 key购买 nike

我正在开发一个需要进行日志记录的 Ruby 库。理想情况下,我希望多个工作进程能够登录同一个文件。查看来自 Ruby 标准库的 Logger 类的源代码,我看到努力从多个线程同步写入日志(正如对 Is Ruby's stdlib Logger class thread-safe? 的回答中所指出的)。

当多个进程写入同一个日志文件时,似乎存在类似的问题:根据底层决定缓冲/拆分写入的方式,每个日志消息可能无法保持其完整性。

那么,有没有一种方法可以使用标准的 Logger 类来允许多个进程安全地记录到一个文件中?如果不是,这在 Ruby 项目中通常是如何完成的?

这就是我所说的“安全”的意思:

  1. 每个日志行都是“原子的”——在下一条消息开始之前完整地出现,不间断。例如不像[1/1/2013 00:00:00] (PID N) LOGMESS[1/1/2013 00:00:01] (PID M) LOGMESSAGE2\nAGE1
  2. 只要日志中出现的时间戳是正确的,日志消息不需要跨进程严格排序。

更新:

我决定听取锡人的建议并编写一个测试,您可以在这里找到它: https://gist.github.com/4370423

简短版本:Winfield 是正确的,至少在 Logger 的默认用法下,同时从多个进程使用它是安全的(对于上面给出的“安全”定义)。

关键因素似乎是如果给定文件路径(而不是已经打开的 IO 对象)Logger 将以 WRONLY|APPEND 模式打开文件,并设置 sync= true 就可以了。这两件事的结合(至少在我在 Mac OS X 上的测试中)似乎使得从多个进程并发登录是安全的。如果你想传入一个已经打开的 IO 对象,只需确保以相同的方式创建它。

最佳答案

是的,您可以按照您描述的方式安全地将交错日志数据写入单个日志文件。

但是,您最好为每个进程记录一个单独的日志,或者使用像 syslog 这样的综合日志系统。以下是几个原因:

  • 日志轮换/管理:当您必须协调多个进程的信号时,截断/滚动日志文件很困难
  • 即使您注入(inject) PID 来消除歧义,交错数据也可能会造成混淆

我目前使用单个日志文件管理每个系统的多个 Resque 工作人员,希望我为每个工作人员分开一个日志文件。调试问题和正确管理日志一直很困难。

关于ruby - Ruby 的 stdlib Logger 类能否安全地处理来自多个进程的编写器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13908745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com