大多数Unix程序员将被用于由syslog.h
定义的接口,并且许多实现(例如glibc)对发送给它的系统日志消息的大小没有真正的限制,但是通常对应用程序进行监听/dev/log
。
我想知道是否有人知道一种方法来查找系统日志的最大消息大小? 或者一些关于实际(或通常)限制的很好的文档?
编辑:
到目前为止,我已经在这个主题上find了这些RFC:
记住syslog是一个协议,这意味着它设置最低限度,并提出建议。 我找不到这个源代码,但我相信应该支持的最小长度是1k,建议使用64k。
每个实现都可以自由地做他们想做的事情,也就是说,如果你想要一个16MB的最大值,并且正在写一个系统日志服务器,你可以自由地做到这一点。 我不知道你为什么会,但你可以。
据我所知,没有标准的programatic
方法来确定这一点,所以保持在1k以下的信息将是便携性的理想选择。
更新
User MuMind在评论中指出, rsyslog截断为2097个字符,包括日志类型/时间戳。 由于这是协议的一个广泛使用的实现,这加强了长度应保持在1k – 1.5k之间,以实现最大的便携性。
老实说,超过这个的唯一理由是记录额外的调试/崩溃输出; 把/var/log
放在/var/log
好多了,只要说明你在和syslog进行交流的时候这样做(当然,有些情况下你不能这样做,但是有很多库都是尽力而为的)处理)。
由于系统日志是通过UDP使用的协议,在这种情况下,限制是UDP数据报大小减去大约65k的报头的几个字节。 / dev / log unix域套接字可以是数据报或流套接字(SOCK_STREAM或SOCK_DGRAM),在前一种情况下,64k限制不适用,但如果不是这种情况,最好考虑将UDP数据报大小作为限制阅读邮件的程序的作者。
对于“旧”(RFC 3164)syslog,系统日志数据报的有效负载(包括编码的优先级和时间戳)的最大长度是1024个八位位组,并且没有最小长度,尽管应该删除空syslog数据包。 此外,更长的数据报不应该按照6.1节转发。 (如果添加时间戳信息,中继必须截断数据包,这会增加长度; 第4.3.2节 )
这真的很老了,没有人真正关注这个问题,但是如果你使用的是非常老的系统,那么请记住这一点。
现代系统遵循(或多或少)RFC 5424,其中第6.1节规定每个人必须能够处理的最小大小为480个八位字节,表明每个人至少能够处理2048个八位字节,并且没有最大值。
一个非常常用的传输是RFC 5426中定义的UDP,其中第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格式进行网络接收和日志消息传输。)
Rsyslog添加了在2011年版本6.3.4中设置程序许多区域中使用的最大消息大小( maxMessageSize
配置参数)的能力,此时默认值被设置为8096个八位位组,此后它一直保留。