15

大多数 Unix 程序员会习惯 定义的接口syslog.h,并且许多实现(例如 glibc)对发送给它的 syslog 消息的大小没有真正的限制,但通常对监听的应用程序有限制/dev/log

我想知道是否有人知道找到系统日志的最大消息大小的方法?或者一些关于实际(或通常)限制的好文档?

编辑:

到目前为止,我已经找到了有关该主题的这些 RFC:

4

3 回答 3

10

请记住,syslog 是一种协议,这意味着它会设置最小值并提出建议。我找不到这方面的来源,但我相信应该支持的最小长度是 1k,建议使用 64k。

每个实现都可以自由地做他们想做的事,即如果您想要最大 16MB 并且正在编写一个系统日志服务器,那么您可以自由地这样做。我不知道你为什么会,但你可以。

据我所知,没有标准programatic的方法来确定这一点,因此将消息保持在 1k 以下将是可移植性的理想选择。

更新

用户MuMind在评论中指出rsyslog截断为 2097 个字符,包括日志类型/时间戳。由于它是一种广泛使用的协议实现,这强化了长度应保持在 1k - 1.5k 之间以实现最大的可移植性。

老实说,超过这个值的唯一原因是记录额外的调试/崩溃输出;最好它放在某个地方/var/log,并在与 syslog 交谈时表明你这样做了(当然,有些场景你不能这样做,但是很多库都内置了“尽力而为”的日志来处理这个问题) .

于 2010-07-22T16:25:52.200 回答
7

“旧”系统日志

对于“旧”(RFC 3164)系统日志,系统日志数据报的有效负载(包括编码的优先级和时间戳)的最大长度为 1024 个八位字节,根据第 4.1 节,并且没有最小长度,尽管应该丢弃空的系统日志数据包。此外,不应按照第 6.1 节转发更长的数据报。(如果添加了会增加长度的时间戳信息,则中继必须截断数据包;第 4.3.2 节。)

这真的很老了,没有人真正遵循这个了,但是如果您使用的是非常旧的系统,请记住这一点。

“现代”系统日志

现代系统遵循(或多或少)RFC 5424,在第 6.1 节中,它将每个人必须能够处理的最小大小设置为 480 个八位字节,建议每个人至少能够处理 2048 个八位字节,并且没有最大值。

一个非常常用的传输是 UDP,在 RFC 5426 中定义,其中第 3.2 节详细介绍了消息大小。最大允许值是您可以通过网络获得的数据报中的最大容量(取决于 64k 的大小)。然而,IPv4 的最低要求是 480 个八位字节,最好系统应该接受至少 2048 个八位字节。不过,还有一些关于 MTU 等的更多内容,所以一般来说,如果您不确定要处理的系统,您可能希望将大小限制在路径的最低 MTU 以下包括所有标题等;如果您不确定,大约 1300 个八位字节将是一个很好的猜测。

不过,这仅适用于 UDP;通过 TLS 链接,接收者必须能够处理至少 2048 个八位字节的消息,最好是 8192 个八位字节(RFC 5425 第 4.3.1 节。但当然你需要小心这一点,因为如果消息恰好在稍后通过 UDP 传输转发, UDP 长度适用。

系统日志

Rsyslog(抱歉,Ranier,但“正确的”全大写形式会分散注意力)可能是当今最流行的 syslog 守护进程。(即使使用 systemd/journald 的系统仍然使用 rsyslogd 进行网络接收和传输 syslog 格式的日志消息。)

RsyslogmaxMessageSize在 2011 年的 6.3.4 版本中添加了设置程序许多区域中使用的最大消息大小的功能(配置参数),此时默认值设置为 8096 字节,此后一直保持不变。

于 2017-01-24T07:18:13.263 回答
4

由于 syslog 是在 UDP 上使用的协议,在这种情况下,限制是 UDP 数据报大小减去标头的几个字节,约为 65k。/dev/log unix 域套接字可以是数据报或流套接字(SOCK_STREAM 或 SOCK_DGRAM),在前一种情况下,64k 限制不适用,但如果您不是阅读消息的程序的作者。

于 2011-10-14T19:05:29.993 回答