Linux 查找系统日志最大消息长度

Linux 查找系统日志最大消息长度,linux,syslog,Linux,Syslog,大多数Unix程序员将习惯于使用由syslog.h定义的接口,许多实现(如glibc)对发送给它的syslog消息的大小没有实际限制,但通常对侦听/dev/log的应用程序有限制 我想知道是否有人知道如何找到系统日志的最大消息大小?或者一些关于实际(或通常)限制的好文件 编辑: 到目前为止,我已经在该主题上找到了这些RFC: 请记住,syslog是一种协议,这意味着它可以设置最小值并提出建议。我找不到这方面的来源,但我相信应该支持的最小长度是1k,建议使用64k 每个实现都可以自由地执行它

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

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

编辑:

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


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

每个实现都可以自由地执行它们想要的操作,也就是说,如果您想要最大16MB的内存,并且正在编写syslog服务器,那么您可以自由地执行这些操作。我不知道你为什么会,但你可以

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

更新

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


老实说,超过这个值的唯一原因是记录额外的调试/崩溃输出;最好将其放在
/var/log
中的某个地方,并在与syslog交谈时指出您是这样做的(当然,有些情况下您不能这样做,但许多库都内置了“尽力”日志来处理这一问题)

由于syslog是通过UDP使用的协议,在这种情况下,限制是UDP数据报大小减去报头的几个字节,约为65k。 /DEV/log UNIX域套接字可以是数据报或流套接字(SockJousSoC或SockZdGRAM),在前者的情况下,64K限制不适用,但是如果您不是程序读取消息的作者,最好考虑UDP数据报大小作为限制。 对于“旧”(RFC 3164)系统日志,系统日志数据报的有效负载(包括编码的优先级和时间戳)的最大长度为1024个八位字节,根据,没有最小长度,但应丢弃空的系统日志数据包。此外,较长的数据报不应按照转发。(如果中继器添加了会增加长度的时间戳信息,则必须截断数据包;)

这是非常古老的,没有人真正遵循这一点,但如果您使用非常古老的系统,则需要记住这一点

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

一个非常常用的传输是UDP,在RFC 5426中定义,其中详细介绍了消息大小。允许的最大值是您可以通过网络获得的数据报的最大值(根据具体情况,该数据报将略低于64k)。然而,IPv4至少需要480个八位字节,系统最好至少接受2048个八位字节。关于MTU等还有一些更进一步的内容,所以一般来说,如果您不确定正在处理的系统,您可能希望在包含所有标头等时,将大小限制在路径的最低MTU以下;如果你不确定的话,大概1300个八位组是个不错的猜测

不过,这只是针对UDP的;通过TLS链路,接收器必须能够处理至少2048个八位字节的消息,最好是8192个八位字节的消息。但是,您当然需要小心,因为如果消息稍后碰巧通过UDP传输转发,UDP长度将适用

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


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

是的,没错-是否有任何东西记录了这个1k、64k、16mb的东西?即使我不能用编程的方式计算出来,也最好记录下这个随机常数在代码中的来源。当然,我是应该意识到有一个关于syslog的RFC,所以我想会的do@Petriborg-它的实现是特定的,但不存在确定限制的标准方法。在syslog()之前,您可以(也许)开始以1k个块的倍数写入在配置时无法找到它,但这很糟糕,您的日志例程仍然必须将其分解为块,这更糟糕。您不能发送到syslog的内容..只需发送到日志文件并在syslog中引用它?对于超出限制的消息是否会被截断或被拒绝,我找不到一致意见。在我的在使用rsyslog的系统中,我在/var/log/auth.log中看到消息被截断(2097个字符,包括时间戳)。我不知道这是不是可以保证的,或者其他实现是否工作相同。顺便说一句,忽略前导的时间戳和主机名,它是2044个字符。