大多数Unix程序员习惯于由syslog.h
定义的接口,并且许多实现(例如glibc)对发送到其的syslog消息大小没有真正限制,但是通常会限制监听/dev/log
的应用程序。
我想知道是否有人知道如何找到syslog的最大消息大小?或者有什么好的关于这个限制的文档(实际上或通常)?
编辑:
到目前为止,我已经在这个主题上找到了这些RFCs:
大多数Unix程序员习惯于由syslog.h
定义的接口,并且许多实现(例如glibc)对发送到其的syslog消息大小没有真正限制,但是通常会限制监听/dev/log
的应用程序。
我想知道是否有人知道如何找到syslog的最大消息大小?或者有什么好的关于这个限制的文档(实际上或通常)?
编辑:
到目前为止,我已经在这个主题上找到了这些RFCs:
rsyslog
在包括日志类型/时间戳在内的2097个字符处被截断。由于这是协议的广泛使用实现,因此强调应将长度保持在1k-1.5k之间以实现最大的可移植性。/var/log
中,并在与syslog交谈时指出您已经这样做(尽管有些情况下可能无法这样做,但许多库已经内置了“尽力而为”的日志记录以处理这种情况)。对于“旧版”(RFC 3164)Syslog,一个Syslog数据包的有效载荷最大长度(包括编码优先级和时间戳)为1024个八位字节,根据第4.1节。没有最小长度,但应丢弃空Syslog数据包。此外,根据第6.1节,不应转发更长的数据包。(如果中继添加了增加长度的时间戳信息,则必须截断数据包;第4.3.2节。)
这是非常古老的规范,现在几乎没有人再遵循它,但如果你正在使用非常古老的系统,这是需要记住的。
但这只适用于UDP;在TLS链路上,接收者必须能够处理至少2048个八位字节的消息,并最好为8192个八位字节(RFC 5425第4.3.1节)。但是,如果消息稍后被转发到UDP传输中,需要小心处理UDP长度。
Rsyslog(抱歉,Ranier,但“正确”的全大写形式令人分心)可能是当今最流行的系统日志守护程序。(即使使用systemd / journald的系统仍然使用rsyslogd以syslog格式接收和传输日志消息。)
Rsyslog在2011年的6.3.4版本中添加了在程序的许多区域中设置最大消息大小的功能(maxMessageSize
配置参数),此时默认值设置为8096个八位字节,并一直保持至今。
由于syslog是使用UDP协议的,因此在这种情况下,限制是UDP数据报大小减去一些标头字节,大约为65k。
/dev/log Unix域套接字可以是数据报或流套接字(SOCK_STREAM或SOCK_DGRAM),在前一种情况下,64k限制不适用,但最好考虑UDP数据报大小作为限制,如果您不是读取消息的程序的作者。