您的位置:首页 > 其它

Syslog 每条消息最大长度分析

2015-09-24 21:37 253 查看

问题

syslog 就不多说了,最近碰到一个问题:在用LogInsight的时候,一条日志会被分成两条,第一条以…结尾,第二条以…开头,并且第二条没有被正确的建立索引。想了一下由于是用log4j发的syslog消息,所以消息被分割可能是log4j的问题,于是看了一下代码,找到这么两块:

if(packet.length() > 256) {
this.splitPacket(hdr, packet);
} else {
this.sqw.write(packet);
}




private void splitPacket(String header, String packet) {
int byteCount = packet.getBytes().length;
if(byteCount <= 1019) {
this.sqw.write(packet);
} else {
int split = header.length() + (packet.length() - header.length()) / 2;
this.splitPacket(header, packet.substring(0, split) + "...");
this.splitPacket(header, header + "..." + packet.substring(split));
}
}


看起来如果有包的内容大于1019的话,会切成两块,那么1019是怎么来的呢?

Syslog 协议

BSD syslog protocol

The BSD syslog Protocol 上面说到,一条消息分为三部分:PRI,header和msg(就是body)。PRI用来表示设备或者优先级,它可能有3,4,5个字节。header可以为空。而一条消息最大是1024个字节,那么对msg,1024-5=1019 这就是长度限制的来历。

RFC5424 syslog protocol

RFC5424 则规定最大长度是2048个字节。

log4j

log4j 1.2

这里的syslog appender 在代码里是参照BSD syslog 来写的,而我们的项目用的又是log4j1.2。。。太老了啊。。

log4j 2

log4j 2还是比较人性化的。。同时支持BSD和RFC 5424,可选的项也多了好多,文档也好全。。。我猜测它还支持BSD就是为了让log4j1.2更容易的迁移到log4j2里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: