問題
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裏。