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

标签 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, line 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 :   }

最佳答案

注意:这还不完全正确。仍然没有想出如何为函数的结尾获取正确的行号。

编辑:

经过一些挖掘,我设法接近了,但没有雪茄:

您必须对出现 #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 

关于c++ - 窗口上 C/C++ 的自动记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20112450/

相关文章:

c++ - Qt 5 : Access Cookies in QtWebEngine

c++ - 临时对象和非常量引用

java - ServletContext.log 消息在 tomcat 7 中的位置?

c# - 如何强制重新加载 NLog 配置文件?

logging - 如何更改 serenity-bdd 日志设置

c++ - 如何直接修改va_list结构成员?

c++ - 序列化结构的 STL 映射

c++ - 指针值 0x7c7c7c7c 的特殊含义

database - 从汇总的Weblogs数据中检索信息,该怎么做?

java - 使用 log4j2 将 System.out 写入文件