使用多个嵌套函数在c ++中打印调试语句的最佳方法

时间:2017-03-16 23:01:37

标签: c++ debugging io

让我们说我们有两个功能

int func_a()
{
  //do something simple

  if (debug_level > 1)
     cout << "Some debug message" << endl;
}

int func_b()
{
   //call func_a a couple of times
   for (int i=0; i<10; i++) {
      func_a();
   }

   //do some more complex stuff

  if (debug_level > 0) {
    //only debug stuff related to this function, not stuff in func_a()
    cout << "Some debug message" << endl;
  }
}

func_b调用func_a,但这两个函数都很有用,可以由用户独立调用。

如果我使用上面的简单debug_level,你可以看到debug_level随着嵌套层(func_c调用func_b调用func_a)的增加而快速增加。

此外,对于用户而言,在“层次结构”中与较高级别的函数调用中指定较高的debug_level并不直观。

如何最好地组织调试输出?大型复杂项目的最佳实践是什么?

1 个答案:

答案 0 :(得分:2)

在一个非常大的项目中,我认为你通常需要两个设置。

调试级别,这是日志记录的详细程度。例如“debug”,“info”,“warning”,“error”。

另一件事是位置。您可能需要将过滤器设置为仅接收来自某些模块的日志。这可以通过许多方式实现。我们在公司使用什么来将原点编码为字符串。非常像一个网址。

所以日志看起来像是:

/module-a/function-1/  DEBUG  "Enter"
/module-a/function-1/  INFO  "Value added"
/module-b/function-1/ WARNING "Called with value out of range. Using default."

等等。

然后,所有这些都被推送到某种数据库,我们可以通过过滤位置轻松地询问查询。

/将匹配所有内容

/ module-a匹配从模块a。

记录的所有内容

等等。

此外,我们也可以指定详细程度。

这非常灵活。可能在任何日志记录系统中最困难的部分是决定记录什么,何时记录以及在哪个级别。

编辑: 因此,澄清函数a是否可以从模块b和c调用。然后传入函数中的模块名称,让函数将其名称添加到“uri”并使用该名称进行记录。然后,您可以在日志中过滤并找出从b调用函数的哪些日志以及从c调用哪些日志。