查找syslog最大消息长度

17

大多数Unix程序员习惯于由syslog.h定义的接口,并且许多实现(例如glibc)对发送到其的syslog消息大小没有真正限制,但是通常会限制监听/dev/log的应用程序。

我想知道是否有人知道如何找到syslog的最大消息大小?或者有什么好的关于这个限制的文档(实际上或通常)?

编辑:

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

3个回答

10
请记住,syslog是一种协议,这意味着它设定了最低标准并提出了建议。我找不到相关来源,但我认为应该支持的最小长度为1k,推荐长度为64k。
每个实现都可以自由选择,例如,如果您想要一个16MB的最大值并且正在编写syslog服务器,则可以自由选择。我不确定为什么会这样做,但您可以这样做。
据我所知,没有标准的编程方式来确定这一点,因此将消息保留在1k以下对于可移植性来说是理想的。
更新
用户MuMind在评论中指出rsyslog在包括日志类型/时间戳在内的2097个字符处被截断。由于这是协议的广泛使用实现,因此强调应将长度保持在1k-1.5k之间以实现最大的可移植性。
老实说,唯一超过这个限制的原因是记录额外的调试/崩溃输出;最好将其放在/var/log中,并在与syslog交谈时指出您已经这样做(尽管有些情况下可能无法这样做,但许多库已经内置了“尽力而为”的日志记录以处理这种情况)。

没错 - 有没有任何文档记录这个1k、64k、16mb的事情?即使我无法以编程方式弄清楚它,也很好将代码中这个随机常量来自哪里进行记录。 - Petriborg
当然,我应该意识到有关syslog的RFC(s)- http://www.faqs.org/rfcs/rfc5426.html - http://www.faqs.org/rfcs/rfc3164.html 所以我想那个可以 - Petriborg
1
@Petriborg - 这是实现特定的,但没有标准手段来确定限制。你可以(也许)从1k块的倍数开始编写,直到在配置时syslog()失败为止,以找出它,但那只是令人不快的,你的日志记录例程仍然必须将其分解成块,这更加令人不快。你不能发送到syslog的内容...只需将其发送到日志文件并在syslog中引用即可。我找不到关于超过限制的消息是否会被截断或拒绝的共识。 - Tim Post
2
在我的rsyslog系统中,我发现/var/log/auth.log中的消息被截断(包括时间戳在内的2097个字符)。不知道这是否保证或其他实现是否相同。 - Mu Mind
@MuMind 很有趣,这是一种非常广泛使用的协议实现方式,因此保持消息长度在1k / 1.5k _with_时间戳和日志类型似乎是一个很好的防御性方法。老实说,我不明白为什么有人需要超过1k,如果你正在进行调试数据转储,你应该只在/var/log中进行,并在syslog中指示你已经这样做了。我将更新我的答案。 - Tim Post
1
顺便说一下,忽略前导时间戳和主机名,它有2044个字符。 - Mu Mind

8

“旧版”Syslog

对于“旧版”(RFC 3164)Syslog,一个Syslog数据包的有效载荷最大长度(包括编码优先级和时间戳)为1024个八位字节,根据第4.1节。没有最小长度,但应丢弃空Syslog数据包。此外,根据第6.1节,不应转发更长的数据包。(如果中继添加了增加长度的时间戳信息,则必须截断数据包;第4.3.2节。)

这是非常古老的规范,现在几乎没有人再遵循它,但如果你正在使用非常古老的系统,这是需要记住的。

“现代”Syslog

现代系统(或多或少)遵循 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

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

Rsyslog在2011年的6.3.4版本中添加了在程序的许多区域中设置最大消息大小的功能(maxMessageSize配置参数),此时默认值设置为8096个八位字节,并一直保持至今。


4

由于syslog是使用UDP协议的,因此在这种情况下,限制是UDP数据报大小减去一些标头字节,大约为65k。

/dev/log Unix域套接字可以是数据报或流套接字(SOCK_STREAM或SOCK_DGRAM),在前一种情况下,64k限制不适用,但最好考虑UDP数据报大小作为限制,如果您不是读取消息的程序的作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接