大多数 Unix 程序员会习惯 定义的接口syslog.h
,并且许多实现(例如 glibc)对发送给它的 syslog 消息的大小没有真正的限制,但通常对监听的应用程序有限制/dev/log
。
我想知道是否有人知道找到系统日志的最大消息大小的方法?或者一些关于实际(或通常)限制的好文档?
编辑:
到目前为止,我已经找到了有关该主题的这些 RFC:
大多数 Unix 程序员会习惯 定义的接口syslog.h
,并且许多实现(例如 glibc)对发送给它的 syslog 消息的大小没有真正的限制,但通常对监听的应用程序有限制/dev/log
。
我想知道是否有人知道找到系统日志的最大消息大小的方法?或者一些关于实际(或通常)限制的好文档?
编辑:
到目前为止,我已经找到了有关该主题的这些 RFC:
请记住,syslog 是一种协议,这意味着它会设置最小值并提出建议。我找不到这方面的来源,但我相信应该支持的最小长度是 1k,建议使用 64k。
每个实现都可以自由地做他们想做的事,即如果您想要最大 16MB 并且正在编写一个系统日志服务器,那么您可以自由地这样做。我不知道你为什么会,但你可以。
据我所知,没有标准programatic
的方法来确定这一点,因此将消息保持在 1k 以下将是可移植性的理想选择。
更新
用户MuMind在评论中指出rsyslog
截断为 2097 个字符,包括日志类型/时间戳。由于它是一种广泛使用的协议实现,这强化了长度应保持在 1k - 1.5k 之间以实现最大的可移植性。
老实说,超过这个值的唯一原因是记录额外的调试/崩溃输出;最好把它放在某个地方/var/log
,并在与 syslog 交谈时表明你这样做了(当然,有些场景你不能这样做,但是很多库都内置了“尽力而为”的日志来处理这个问题) .
对于“旧”(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 字节,此后一直保持不变。
由于 syslog 是在 UDP 上使用的协议,在这种情况下,限制是 UDP 数据报大小减去标头的几个字节,约为 65k。/dev/log unix 域套接字可以是数据报或流套接字(SOCK_STREAM 或 SOCK_DGRAM),在前一种情况下,64k 限制不适用,但如果您不是阅读消息的程序的作者。