我正在研究需要进行日志记录的Ruby库.理想情况下,我希望多个工作进程能够登录到同一个文件.Logger
从Ruby的标准库查看该类的源代码,我看到我们正在努力将写入从多个线程同步到日志中(正如在Ruby的stdlib Logger类线程安全的答案中所指出的那样).
当多个进程写入同一个日志文件时似乎存在类似的问题:取决于底层如何决定缓冲/拆分写入,每个日志消息可能无法保持其完整性.
那么,是否有一种方法可以使用标准Logger
类来允许多个进程安全地登录到单个文件?如果没有,这通常如何在Ruby项目中完成?
这就是'安全'的意思:
[1/1/2013 00:00:00] (PID N) LOGMESS[1/1/2013 00:00:01] (PID M) LOGMESSAGE2\nAGE1
更新:
我决定接受Tin Man的建议并编写测试,你可以在这里找到:https: //gist.github.com/4370423
简短版本:Winfield是正确的,至少在默认情况下使用Logger
它可以安全地同时使用多个进程(对于上面给出的'safe'的定义).
关键因素似乎是如果给定一个文件路径(而不是已经打开的IO对象),Logger将以模式打开文件WRONLY|APPEND
,并sync=true
在其上设置.这两件事的组合(至少在我对Mac OS X的测试中)似乎可以安全地从多个进程同时记录.如果要传入已打开的IO对象,请确保以相同的方式创建它.
Win*_*eld 10
是的,您可以按照您描述的方式安全地将交错日志数据写入单个日志文件.
但是,最好为每个进程记录单独的日志,或者使用syslog等整合的日志记录系统.以下是几个原因:
我目前正在使用单个日志文件管理每个系统的一些Resque工作者,并希望我为每个工作者分隔了一个日志文件.调试问题和正确管理日志很困难.