增加 rsyslog/syslog 精度以包含秒的小数部分?

增加 rsyslog/syslog 精度以包含秒的小数部分?

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

时间戳目前以秒为单位,但我想提高精度这些时间戳包含毫秒。使用 syslog 变体(例如 rsyslog(RedHat、Ubuntu)或 FreeBSD 上的 Syslog)可以实现这一点吗?

如果我确实将日志时间戳增加到包括微秒,这些时间戳有多准确?如果事件发生在 03:37:02:001 ,这是否意味着事件实际上发生在那个精确的毫秒,或者 syslog 写入事件时是否存在延迟?

答案1

最多现代的Syslog 守护进程(包括 rsyslog 和 syslog-ng)支持高精度时间戳。如果您正在使用其中一种工具,则配置它应该不难。

至于它的准确性……这要视情况而定。首先,这将取决于硬件。大多数现代硬件都支持高精度时间,但并非全部。假设硬件支持它,仍存在一些挑战。首要任务是确保您的时钟设置准确,并且任何其他记录到它的机器都有匹配的时间(假设您将所有系统的日志发送到中央日志主机)。 ntpd是保持时钟时间准确的标准工具(通常与ntp.org 池)。

最后,我们来谈谈事件本身。简而言之,几乎总是会有至少一点偏差,即使偏差非常小。这里仍然会有一些变化,这取决于其他因素。很大程度上取决于事件的来源以及它是如何被拾取的。例如,如果我有一个执行 foo 的应用程序,然后向 syslog 发送一个日志说该应用程序执行了 foo,那么从 foo 完成到发送日志可能需要 100 毫秒。syslog() 系统调用可能还需要 20 毫秒才能完成。

我不记得 syslog 的底层细节,但我不相信事件在提交到 syslog 时被打上时间戳,我认为事件在被 syslog 守护进程拾取时被打上时间戳。这又增加了几毫秒的时间。

基本上,除非您处理的是具有实时日志记录功能的实时系统,否则我认为您永远无法获得 100% 的完美准确性。即便如此,您也可能会有(微观)程度的漂移,但至少您会受到限制以了解您的误差幅度。同时,除非您有这种程度的要求,否则您的时间戳可能已经足够准确了。

答案2

Christopher 介绍了技术注意事项:运行 ntpd,将其指向可靠的来源,并注意漂移。我想补充几点说明:

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

    基准.测量 { logger.info'narf'}.real => 0.000149965286254883

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

  • 时钟漂移在虚拟机上很常见。从传闻来看,每天 3 秒是典型的。ntpdate作为夜间 cron 作业运行是不够的。

  • 上下文通常使顺序变得非常明显。如果你还没有遇到过只有毫秒精度才能知道哪个事件先发生的情况,那么这可能不值得花时间。

答案3

在 /etc/rsyslog.conf 中替换

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

经过

$ActionFileDefaultTemplate RSYSLOG_FileFormat

重新启动 rsyslog 服务后,日志文件中会出现毫秒数

相关内容