gpt4 book ai didi

c++ - 从日志消息中删除静态文本并仅保存变量

转载 作者:行者123 更新时间:2023-11-30 16:07:10 25 4
gpt4 key购买 nike

我知道有一种方法可以从日志消息中删除静态文本,并仅将消息的变量部分保留在内存中。但我不确定它到底是如何完成的。

举一个具体的例子来说明我的意思:

这是客户端的一些代码:

#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;
}

应该做什么:

  1. 在编译/构建期间:

在编译/构建期间生成 XML 文件,为每条消息提供 ID:

<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:
  • messages_array

  • 在后处理期间:运行时保存的值将被迭代并与构建期间保存的 XML 文件组合。此后处理步骤将生成日志文件:
  • 这是消息 1
    这是消息 2

    我在这里试图解决的主要问题是“不必在运行时将静态文本写入文件。相反,只需消息的 ID 和消息中发送的参数值。

    那么,我该怎么做呢?

    最佳答案

    恐怕如果没有一些额外的预处理/后处理,这对于 C 来说是不可能的。

    一种解决方案是使用 __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 参数编译时,它将生成类似这样的内容到标准输出:

    int main()
    {
    logPlaceholder(0, "hello%d"); logFunction(1);
    logPlaceholder(1, "world%d"); logFunction(2);
    return 0;
    }

    当您将 gcc 输出重定向到可以进行后处理的文件时 - 查找 logPlaceholder 字符串并生成包含消息编号、字符串和所有参数的 XML。

    但是 __COUNTER__ 是特定于编译器的(非标准),并且对于所有宏都是全局的。

    关于c++ - 从日志消息中删除静态文本并仅保存变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739646/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com