每个printf调用前置或附加

时间:2013-07-30 01:09:35

标签: c++ logging printf overloading

如何在C ++中重载/覆盖printf,使其满足以下条件:

  1. 打印到STDOUT的每一行都预先附加或附加 我选择的人物。

  2. 对printf的调用并未模糊 - 即,我需要能够调用printf并修改每一行。一世 不要打电话给“myPrintf”或类似的东西。

  3. 背景

    我正拼命地想要构建和查看使用* nix系统中的DXGI API的程序的标准文本输出。我在Windows系统上安装了SSH服务器,Jenkins和Jenkins CLI。

    问题是Jenkins,当它给我构建的输出时,并没有以脚本方式标记我的程序的输出 - 也就是说,它与我的其他构建步骤的输出混淆,以及一般詹金斯的输出。

    我希望能够以某种已知的字符集标记我的程序输出的每一行 - 这将允许我通过grep管道输出我的命令并获取我的程序的实际日志。通过保持printf调用不受骚扰,我也可以使用宏定义切换此调试输出。

    修改

    我愿意接受其他建议 - 以某种方式标记我的可执行文件的输出肯定也是一个选项,但它需要使用适用于 Windows 服务器的功能。

    基本上,我已经到了可以在我的* nix机器上键入“make test”的地步,它将构建并给我(当前模糊的)测试输出,就好像它是本地的,但编译和执行是实际上远程发生。这非常棒 - 我的最后一步是去除测试输出。

1 个答案:

答案 0 :(得分:1)

最方便的方式:

#include <stdio.h>
#include <stdarg.h>
using namespace std;
int taggedPrintf(const char * format, ...){
   printf("[PRE]");
   va_list args;
   va_start (args, format);
   vprintf (format, args);
   va_end (args);
   printf("[POST]\n");
}
#define printf taggedPrintf

int main()
{
   printf("your usual message");
   printf("Testing numbers %d %f", 1,0.2);
   return 0;
}

另一种方式:(快速) 您可以尝试定义缩写:

#define PRE printf("[PREFIX]");
#define POST printf("[SUFFIX]\n");

int main()
{
   PRE
   printf("your usual message");
   POST
   return 0;
}

另一种方法: 将stdout重定向到null设备以阻止屏幕输出

freopen("/dev/null", "a", stdout);

定义一个大字符串缓冲区

char largeBuffer[LARGE_ENOUGH];

使用setbuf将所有内容发送到此缓冲区

setbuf(stdout, largeBuffer);

.....
(Use printf as usual.)
.....

最后,您需要将标记附加并添加到每行或整个输出,并取消重定向,最后打印标记的流。