2012-03-27 65 views
3

现有ç/C++的日志方案。原来,Pantheios可能是在我的情况最好的一些调查,这是最低的开销,如果日志被禁用。C/C++日志工具调用取决于日志级别

所有的记录器似乎都支持某种打印日志消息。但是,在我的情况下,我有一个函数调用,应该避免日志记录被禁用(因为它非常昂贵)。

目前,我用一个很简单的记录设置像

#ifdef DEBUG_L1  
cout << "msg 1" << endl // log level 1 
#ifdef DEBUG_L2 
printBuffer()   // log level 2 
#endif 
#endif 

,供应我的需要(现在),因为我付出零开销,如果日志被禁用。然而,代码很快看起来很丑,并且不太灵活。

这应该用C++记录器来实现。如上所述,printBuffer()的功能体非常昂贵。如果日志记录关闭,则可以避免调用它。

是否有可能声明一个完整的函数调用只在高于某个日志级别时执行?或者在这种情况下我还需要预处理器吗?

编辑:

谢谢@BobTFish。我实际上正在考虑使用你所描述的那种设置。我想知道如何灵活地实现这种事情。通常我会记录一组字符串和值(int,float和指针)。在风格

cout << "name1=" << int << " name2=" << (void*)(ptr) << endl; 

现在,我真的不喜欢在此时切换到printf的语法。宏观方法如何处理(因为它只用一个类参数进行模板化)?

+0

请说明是否可以在运行时更改日志级别(包括从配置文件读取),而不是编译为 – 2016-02-01 03:05:15

回答

1

我认为你可以使用谷歌日志库从here

典型的使用考勤记录与条件

#include <glog/logging.h> 

{ 
    // Initialize logging. There are multiple options, so read the documentation 
    google::InitGoogleLogging(); 

    void* p; 
    LOG_IF(INFO, p == nullptr) << "We have nullptr. Bomb detected!"; 

    // Don't forget to shut that down 
    google::ShutdownGoogleLogging(); 
} 
0

如果您关心的性能和运行时开销,看看zf_log库。你可能喜欢的东西:

  • 它评估日志参数并仅在必要时调用实际日志功能(当日志级别允许时)。
  • 它具有运行时日志级别和编译时日志级别。低于编译时日志级别的语句编译出来并且没有运行时开销。
  • 运行时日志级别可以在运行时更改,但是当消息日志级别低于运行时日志级别时,参数将不会被评估,并且实际日志功能将不会被调用。唯一将要评估的是if (msg_log_level >= runtime_log_level)
  • 它具有非常小的呼叫站点(每个LOG()行产生的代码量),比其他库小3x-20倍。
  • 它不会减慢包含其标题的源代码的编译速度(与某些仅包含标题的库不同)。
2

我想到的是C++特定的基于模板的日志框架,如easylogging或spdlog。例如,在spdlog中,您可以通过实现接收器接口来创建自定义日志目标。另一个(可能更好)选项是使用它的日志级别功能。

下面一个例子(从spdlog手动复制):

// 
    // Runtime log levels 
    // 
    spd::set_level(spd::level::info); //Set global log level to info 
    console->debug("This message shold not be displayed!"); 
    console->set_level(spd::level::debug); // Set specific logger's log level 
    console->debug("Now it should.."); 

通过实施< <运营商为自己的自定义类,你可以控制哪些数据被转储到日志中。使用logger->should_log()您可以测试是否启用指定的日志级别。