2010-06-23 204 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