查找syslog最大消息长度

时间:2010-07-22 16:05:07

标签: linux syslog

大多数Unix程序员都习惯于syslog.h定义的接口,许多实现(例如glibc)对发送给它的syslog消息的大小没有实际限制,但通常有一个限制关于收听/dev/log的应用程序。

我想知道是否有人知道如何找到syslog的最大邮件大小?或者一些关于实际(或通常)限制的好文档?

编辑:

到目前为止,我已经在主题上找到了这些RFC:

3 个答案:

答案 0 :(得分:10)

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

每个实现都可以自由地执行他们想要的操作,即如果您想要最大16MB并且正在编写系统日志服务器,那么您可以自由地执行此操作。我不确定你为什么会,但你可以。

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

<强>更新

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

老实说,超过这个的唯一原因是记录额外的调试/崩溃输出;而将 更好地放在/var/log中的某个地方,并且只是表明你在与syslog交谈时这样做了(授予,有些情况你不能,但有很多库有内置“尽力而为”的日志来处理这个问题。

答案 1 :(得分:4)

由于syslog是一个通过UDP使用的协议,因此在这种情况下,限制是UDP数据报大小减去标题的几个字节,大约是65k。 / dev / log unix域套接字可以是数据报或流套接字(SOCK_STREAM或SOCK_DGRAM),在前一种情况下,64k限制不适用,但如果不是,则最好将UDP数据报大小视为限制阅读信息的节目的作者。

答案 2 :(得分:3)

“旧”系统日志

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

这真的很老了,没有人真正遵循这个,但是如果你正在使用非常旧的系统,那就要记住了。

“现代”Syslog

现代系统遵循(或多或少)RFC 5424,其中section 6.1它设置了每个人必须能够处理到480个八位字节的最小大小,表明每个人都能够处理至少2048个八位字节,并且没有最大值。

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

但这仅适用于UDP;通过TLS链路接收器必须能够处理至少2048个八位位组消息,最好是8192个八位位组(RFC 5425 section 4.3.1。但是当然你需要小心这个,因为如果消息恰好通过UDP传输转发, UDP长度适用。

rsyslog现在

Rsyslog(对不起,Ranier,但是“正确的”全大写形式令人分心)这可能是目前最受欢迎的系统日志守护程序。 (即使使用systemd / journald的系统仍然使用rsyslogd进行网络接收和以syslog格式传输日志消息。)

Rsyslog添加了在2011年版本6.3.4中设置程序的许多区域(maxMessageSize配置参数)中使用的最大消息大小的功能,此时默认值设置为8096个八位字节,从那以后它一直存在。