从日志消息中删除静态文本,仅保存变量[closed]

问题描述 投票:0回答:1
我不确定为什么有些人喜欢关闭他们不理解的问题。

我曾为以前的雇主工作过,但工作与此类似。在我离开之前,我从来没有机会了解它是如何工作的。因此,它确实存在。如果您不理解该问题,请不要打扰,让讨论继续进行。一旦我们确定了所有细节,很多人就会从这种技术中受益。这可用于记录大量信息,而典型的日志文件写入延迟是无法忍受的。

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

为我的意思举一个具体的例子:

这是客户端的一些代码:

#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文件以为每个消息提供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++ c gcc g++
    1个回答
    0
    投票
    [恐怕如果没有一些额外的预处理/后处理,对于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参数编译时,它将生成类似于stdout的内容:

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

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

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

    © www.soinside.com 2019 - 2024. All rights reserved.