让我们说我们有两个功能
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并不直观。
如何最好地组织调试输出?大型复杂项目的最佳实践是什么?
答案 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调用哪些日志。