窗口上的C / C ++自动记录器

时间:2013-11-21 04:25:46

标签: c++ logging

我正在寻找一种能够以最少的日志代码自动输出日志的解决方案。我需要记录函数进入和退出的行号。

例如:在文件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 :   }

1 个答案:

答案 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.其余的都是正确的。

Ideone link for reference


根据建议,您可以使用临时对象。该对象将仅限于函数调用的范围,因此在函数调用结束后调用析构函数(在函数结束时)。

#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