c++ - C++ 中混合二进制/文本日志记录的最佳实践

标签 c++ logging

在 C++ 中,是否有用于记录二进制数据(例如具有预定义格式的 POD 消息)以及文本数据(用于信息目的)的日志记录框架?

例如,假设我们有一个 POD 类型

struct EmployeeInfo
{
  unsigned int age;
  char name[80];
}

在启动时(比如在 00:00:00.001),我们可能想要发出一个文本日志条目,上面写着“Employee DB app started”。 然后在 00:00:00.002,我们收到了一个新的 EmployeeInfo,因此我们可能想要发出一个包含 EmployeeInfo 数据的二进制日志条目。

对两种类型的事件使用单个日志文件有一些好处,因为事件之间的顺序关系得以维护。日志文件中条目的格式无关紧要(不需要人类可读),只要给定一个日志文件,就很容易编写两个单独的实用程序,一个用于处理(例如 pretty-print )所有 EmployeeInfo文件中的信息,一个用于处理(例如打印到 cout)其中的所有文本条目。

似乎大多数现有的 C++ 日志记录框架(例如 g2log、glog、spdlog 等)仅用于生成人类可读的文本日志文件,其用法通常类似于 printf 或输出到流,例如:

LOGD << "Hello %s!" << "World";

实现“一个文件”要求的一个明显方法是简单地为两个事件设计一个通用的消息格式,例如timestamp + length + type + real data,然后简单的写入一个二进制文件。缺点是:1)日志语句的格式可能不像现有的日志框架那样自然,2)我们需要额外的代码,例如我们需要现有日志框架提供的一些功能,例如每天自动轮换日志文件。

我认为混合二进制/文本日志记录应该是一个相对常见的场景,但我似乎找不到任何现有的 C++ 库。欢迎提出任何建议。谢谢。

最佳答案

我不确定混合二进制和文本日志记录是否常见。我从没听说过。

您可能会考虑仅记录文本,但会在该文本中发出一些(可打印的)“标识符”(可能受 UUID 启发)引用一些其他二进制文件(例如,一个 sqlite 数据库)。因此,您将发出 Hello from _9oXtCgAbkqv 并将一些与 _9oXtCgAbkqv 相关的二进制数据存储在另一个数据库中。顺便说一句,“标识符”甚至可能是其他二进制文件中的一些文件偏移量。

顺便说一句,如果您发出任何类型的二进制日志类数据,您需要有一个实用程序来检查该二进制数据。 (对于文本文件,这不是问题,因为标准文本实用程序,如 Linux 命令 lessgrepawktail, head, split 就够了)。

并且您的问题不是特定于 C++ 的(您可以在 Ocaml、Python、Rust、Common Lisp 等中遇到它)。这是习惯、惯例、操作系统等的问题...请注意,日志文件大多常规,并且像logrotate 这样的实用程序可以管理多个日志文件。

关于c++ - C++ 中混合二进制/文本日志记录的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161680/

相关文章:

database - log4net:如何在数据库中存储数据

c++ - C++ 绿色线程的堆栈分配

c++ - 克隆指针 C++

c++ - 二叉搜索树相对于 C++ vector 的优势

python - Django:在 settings.py 中使用日志记录

python - 从文件直接读入二维列表python

C++:强制模板类型实现一个方法

c++ - C++ 中不区分大小写的标准字符串比较

java - 为什么我无法为该特定项目生成 javadoc?无错误信息

java - 将供应商与普通对象一起传递给 log4j2 无法编译