我曾为以前的雇主工作过,但工作与此类似。在我离开之前,我从来没有机会了解它是如何工作的。因此,它确实存在。如果您不理解该问题,请不要打扰,让讨论继续进行。一旦我们确定了所有细节,很多人就会从这种技术中受益。这可用于记录大量信息,而典型的日志文件写入延迟是无法忍受的。
我知道有一种方法可以消除日志消息中的静态文本,并仅将消息中的变量部分保留在内存中。但是我不确定它是如何完成的。
为我的意思举一个具体的例子:
这是客户端的一些代码:
#include <stdio.h>
#include "my_logging.h"
int main() {
MY_CUSTOM_LOGGING_TECHNIQUE("This is message %d", int, 1);
MY_CUSTOM_LOGGING_TECHNIQUE("This is message %d", int, 2);
return 0;
}
以及应该做什么:在编译/构建期间:
<xml>
<message params=1>
<id>123456</id>
<text>This is message %d</text>
<param>int</param>
</message>
<message params=1>
<id>456342</id>
<text>This is message %d</text>
<param>int</param>
</message>
</xml>
运行期间:只有消息的ID与参数的值一起存储在适当的结构中(此处显示为数组'messages_array'):messages_array:
我在这里要解决的主要问题是“不必在运行时将静态文本写入文件。而是,仅消息的ID和消息中发送的参数的值。
所以,我该怎么做?
一种解决方案是将__COUNTER__
宏与-E gcc参数和后处理结合使用,以生成XML文件。参见以下示例:
#define MY_LOG(string, ...) logPlaceholder(__COUNTER__, string); logFunction(__VA_ARGS__)
void logPlaceholder(int a, const char* str) {}
void logFunction(int param)
{
printf("%d\n", param);
}
int main()
{
MY_LOG("hello%d", 1);
MY_LOG("world%d", 2);
return 0;
}
您可以用可变参数替换logFunction
以接受更多参数。[
logPlaceholder
将被优化,因为它是空函数-输出二进制文件中不存在字符串。当使用-E参数编译时,它将生成类似于stdout的内容:
int main() { logPlaceholder(0, "hello%d"); logFunction(1); logPlaceholder(1, "world%d"); logFunction(2); return 0; }
[将gcc输出重定向到可以进行后处理的文件时-查找logPlaceholder
字符串并生成带有消息号,字符串和所有参数的XML。但是
__COUNTER__
是编译器特定的(非标准的,并且对于所有宏都是全局的。