Syslog 每條消息最大長度分析

問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章