我正在寻找一种能够以最少的日志代码自动输出日志的解决方案。我需要记录函数进入和退出的行号。
例如:在文件example.cpp
中Line 1 : void Fun1()
Line 2 : {
Line 3 : AUTO_LOG_MACRO;
Line 4 : //do something 1
Line 5 : //do something 2
Line 6 : return;
Line 7 : }
Line 8 :
Line 9 : void Fun2()
Line 10 : {
Line 11 : AUTO_LOG_MACRO;
Line 12 : //do something 1
Line 13 : //do something 2
Line 14 : Func1();
Line 15 : //do something 1
Line 16 : //do something 2
Line 17 : return;
Line 18 : }
然后日志文件将是:
example.cpp,第11行,Func2输入
example.cpp,第03行,Func1输入
example.cpp,第06行,Func1退出
example.cpp,第17行,Func2退出
我不想添加许多日志代码,如下所示
Line 1 : void Fun1()
Line 2 : {
Line 3 : FUNCTION_ENTER;
Line 4 : //do something 1
Line 5 : //do something 2
Line 6 : if (bCheckFail1)
Line 7 : {
Line 8 : FUNCTION_EXIT;
Line 9 : return;
Line 10 : }
Line 11 : //do something 3
Line 12 : if (bCheckFail2)
Line 13 : {
Line 14 : FUNCTION_EXIT;
Line 15 : return;
Line 16 : }
Line 17 : //do something 4
Line 18 : FUNCTION_EXIT;
Line 19 : return;
Line 20 : }
答案 0 :(得分:2)
注意:这还不完全正确。还没有弄清楚如何在函数结束时获得正确的行号。
修改强>:
经过一番挖掘,我设法靠近了,但没有雪茄:
你必须硬编码出现#line
的行加上一行(因为它在该行之后开始计数。)
class LogTemporary {
int line;
std::string function;
public:
LogTemporary(int nline, std::string nfunction) : line(nline), function(nfunction) {
#line 13
std::cout<<nline<< " " << nfunction << " enter " << std::endl;
}
~LogTemporary() {
std::cout<<__LINE__+line-13<< " " << function << " exit " << std::endl;
}
};
以下是我的结果:
30 Func2 enter
22 Func1 enter
25 Func1 exit
33 Func2 exit
然而 Func2 exit
关闭了3.其余的都是正确的。
根据建议,您可以使用临时对象。该对象将仅限于函数调用的范围,因此在函数调用结束后调用析构函数(在函数结束时)。
#include <iostream>
class LogTemporary {
int line;
std::string function;
public:
LogTemporary(int nline, std::string nfunction) : line(nline), function(nfunction) {
std::cout<<nline<< " " << nfunction << " enter " << std::endl;
}
~LogTemporary() {
std::cout<<line<< " " << function << " exit " << std::endl;
}
};
#define AUTO_LOG_MACRO LogTemporary log_temporary(__LINE__, __FUNCTION__);
void Func1()
{
AUTO_LOG_MACRO;
//do something 1
//do something 2
return;
}
void Func2()
{
AUTO_LOG_MACRO;
//do something 1
//do something 2
Func1();
//do something 1
//do something 2
return;
}
int main() {
Func2();
}
示例输出:
27 Func2 enter
19 Func1 enter
19 Func1 exit
27 Func2 exit