2010-06-23 245 views
6

在我們的業務中,我們需要記錄每個請求/響應到我們的服務器。 目前,我們使用xml作爲標準實現。 如果我們需要調試/跟蹤某些錯誤,則使用日誌文件。協議緩衝區記錄

我有點好奇,如果我們切換到協議緩衝區,因爲它是二進制的,這將是登錄請求/響應文件的最佳方法是什麼?

例如:

FileOutputStream中輸出=新FileOutputStream中( 「\文件\ log.txt的」); request.build()。writeTo(outout);

對於任何已使用的協議緩衝區在應用程序中,你是如何記錄您的請求/響應,以防萬一我們需要它用於調試的目的?

感謝

回答

0

如果你競爭的日誌記錄和性能則需要我想你可以轉儲你的二進制數據文件原樣,也許通過包含時間戳和長度值,以便標籤之前每個記錄你會知道這個特定的數據位在哪裏結束。但我承認這很醜陋。你需要編寫一個實用程序來閱讀和分析這個文件,如果沒有這個實用工具,它將是無可奈何的。

更合理的解決方案是將文本形式的二進制數據轉儲。我正在考慮文本的「行」,再次從您找到相關的任何標記信息開始,後面是一些十進制或十六進制的長度信息,後面是轉儲緩衝區所需的十六進制字節 - 因此您最終可能會一些相當長的路線。但由於該文件是線性結構化的,因此可以使用面向文本的工具(最簡單情況下的編輯器)來處理它。十六進制轉儲本質上意味着您在日誌中使用兩個字節來表示一個字節的數據(加上一點開銷)。嘿,磁盤空間現在很便宜。

如果這些二進制緩衝器具有相當一致的結構,你甚至可以打破和標籤字段(或類似的東西),使您的數據就變得略微人類可讀的,更重要的是,更好的搜索。當然,這取決於你想讓你的日誌記錄看起來漂亮多少努力;但花在這裏的時間可能會在稍後的分析中得到回報。

1

我們使用C++對象上的ShortDebugString()方法把所有傳入和傳出消息的人類可讀的版本寫下到文本文件中。 ShortDebugString()返回由Java中的toString()方法返回的同一字符串的單行版本。不知道在Java中完成同樣的事情是多麼容易。

1

TL; DR:寫在文本的調試日誌,以二進制寫的長期記錄。

至少有兩種方法可以做到這一點的日誌記錄(也許,其實,你應該兩者)​​:

  1. 寫你的日誌以文本格式。這對於調試和快速檢查您的眼睛有問題很好。
  2. 寫你的日誌中二進制格式 - 這將使未來的分析更快,因爲你可以使用相同的協議緩衝區的代碼加載數據和做各種事情在他們身上。

說實話,這或多或少地是這個技術來自這個技術的地方。

+0

「說實話,這或多或少是這種技術來自這個技術的地方。」 - 協議緩衝區來自Google。你是說你知道Google使用Protocol Buffers進行結構化記錄嗎?你有更多的信息嗎? – 2013-05-25 07:59:12