增加rsyslog / syslog的精度来包含小数秒?

我使用syslog和rsyslog来处理Linux和FreeBSD系统上的日志logging。

时间戳是目前在几秒钟,但我想提高这些时间戳的精度 ,包括毫秒。 这是可能的使用系统日志变种,如rsyslog(RedHat,Ubuntu)或系统日志在FreeBSD?

如果我确实增加了logging时间戳以包含微秒,这些时间戳有多准确? 如果事件发生在03:37:02:001,这是否意味着事件实际发生在毫秒级,或者当syslog写入事件时是否有延迟?

大多数现代 Syslog守护进程(包括rsyslog和syslog-ng)都支持高精度的时间戳。 如果你正在使用这些工具之一,你应该没有configuration它的困难。

至于它的准确性。 。 。 这取决于。 首先,这将取决于硬件。 大多数现代硬件支持高精度时间,但不是全部。 假设硬件支持它,仍然有一些挑战。 最重要的事情是确保你的时钟准确设置,并且其他任何正在login的计算机都有匹配的时间(假设你将所有系统的日志发送到中央日志主机)。 ntpd是维持准确时钟时间的标准工具(通常同步到ntp.org池 )。

最后,我们来到事件本身。 简单的答案是几乎总会有至less一点点漂移,即使是非常轻微的。 这里也会有一些变化,这取决于其他因素。 很大程度上取决于事件的来源,以及如何获取。 例如,如果我有一个应用程序执行foo,然后向syslog发送一条日志,说明该应用程序执行了foo,则在完成foo和发送日志之间可能需要100 ms。 syslog()系统调用可能需要20ms才能完成。

我不记得syslog的底层细节,但是我不认为这个事件被提交给syslog时是有时间戳的,我认为它被syslog守护进程提取时间戳了。 这又增加了几毫秒。

基本上,除非你正在使用实时日志logging工具来处理实时系统,否则我不认为你能达到100%的完美精确度。 即使这样,你也可能有微观的漂移水平,但至less你会有一些限制来知道你的误差。 同时,除非你有这样的要求,否则你的时间戳可能会足够准确。

克里斯托弗涵盖了技术上的考虑:运行ntpd,指出它在一个可靠的来源,并认识到漂移。 我想添加一些注意事项:

  • 时间戳由syslog() libc函数调用设置。 这是uClibc的实现 。 典型的syslog()调用将在1 ms以内完成。 这里是Ruby虚拟机在0.15毫秒包装syslog()

    Benchmark.measure {logger.info'narf'} .real => 0.000149965286254883

  • 虽然syslog可能适合毫秒精度,但许多Web应用程序框架会缓冲日志,然后定期刷新缓冲区,或者在请求结束后输出所有日志作为请求。 几乎所有的Web服务器都是这样做的(这就是W3C通用日志文件格式知道传输字节的方式)。 其影响是毫秒级精度在看起来比较less的情况下是有用的。

  • 时钟漂移在虚拟机上是特有的。 从传闻提到,每天3秒是典型的。 运行ntpdate作为夜间cron作业不够好。

  • 上下文通常会使订单非常明显。 如果你还没有遇到一个毫秒级的精确度是唯一知道哪个事件先发生的唯一方法,那么这可能是不值得的。