协议缓冲日志记录

时间:2010-06-23 13:23:56

标签: protocols protocol-buffers buffer

在我们的业务中,我们需要记录来到我们服务器的每个请求/响应。 目前,我们使用xml作为标准实现。 如果我们需要调试/跟踪某些错误,则使用日志文件。

如果我们切换到协议缓冲区,我有点好奇,因为它是二进制文件,记录请求/响应文件的最佳方法是什么?

例如:

FileOutputStream output = new FileOutputStream(“\ files \ log.txt”);    request.build()的writeTo(outout);

对于在您的应用程序中使用了协议缓冲区的任何人,如何记录您的请求/响应,以防我们需要它进行调试?

由于

4 个答案:

答案 0 :(得分:1)

我们在C ++对象上使用ShortDebugString()方法将所有传入和传出消息的人类可读版本写入文本文件。 ShortDebugString()返回Java中toString()方法返回的相同字符串的单行版本。不确定用Java完成同样的事情是多么容易。

答案 1 :(得分:1)

TL; DR:在文本中写入调试日志,以二进制形式写入长期日志。

至少有两种方法可以执行此日志记录(事实上,您应该同时执行这两种操作):

  1. 以文本格式编写日志。这对于调试和快速检查眼睛问题很有帮助。
  2. 二进制格式编写日志 - 这将使未来的分析更快,因为您可以使用相同的协议缓冲区代码加载数据并对其执行各种操作。
  3. 老实说,这或多或少是在这项技术来自的地方完成的。

答案 2 :(得分:0)

如果您对日志记录和性能有竞争需求,那么我想您可以按原样将二进制数据转储到文件中,可能每个记录前面都有一个包含时间戳和长度值的标记,因此您可以知道这在哪里特定的数据结束。但我不得不承认这非常难看。您将需要编写一个实用程序来读取和分析此文件,如果没有该实用程序,它将无助。

更合理的解决方案是以文本形式转储二进制数据。我正在考虑文本的“行”,再次从您发现相关的任何标记信息开始,然后是十进制或十六进制的一些长度信息,然后是转储缓冲区所需的十六进制字节数 - 因此您可能最终得到一些相当长的路线。但由于文件是行结构化的,因此您可以使用面向文本的工具(最简单的编辑器)来处理它。十六进制转储本质上意味着您在日志中使用两个字节来表示一个字节的数据(加上一点开销)。嘿,这些天磁盘空间很便宜。

如果这些二进制缓冲区具有相当一致的结构,您甚至可以突破并标记字段(或类似的东西),这样您的数据就会变得更具人性化,更重要的是,可以更好地搜索。当然,取决于您需要多少努力才能使您的日志记录看起来很漂亮;但是在这里度过的时间可能会在分析后稍晚回报。

答案 3 :(得分:0)

如果您的消息中包含非ASCII字符串,则只需使用对toString的隐式或显式调用将其记录下来,即可转义字符。

"오늘은 무슨 요일입니까?"变为"\354\230\244\353\212\230\354\235\200 \353\254\264\354\212\250 \354\232\224\354\235\274\354\236\205\353\213\210\352\271\214?"

如果要保留非ASCII字符,请使用TextFormat.printer().escapingNonAscii(false).printToString(message)

有关更多详细信息,请参见this answer