Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;根据日志级别支持条件函数调用的日志记录功能_C++_Logging_C Preprocessor - Fatal编程技术网

C++ C/C++;根据日志级别支持条件函数调用的日志记录功能

C++ C/C++;根据日志级别支持条件函数调用的日志记录功能,c++,logging,c-preprocessor,C++,Logging,C Preprocessor,对现有C/C++日志记录解决方案的一些调查结果表明,Pantheios可能是我的情况下最好的,如果禁用日志记录,这是最低的开销 所有的日志记录器似乎都支持打印日志消息。然而,在我的例子中,如果日志记录被禁用,应该避免使用一个函数调用(因为它非常昂贵) 目前,我使用一个非常简单的日志设置,如 #ifdef DEBUG_L1 cout << "msg 1" << endl // log level 1 #ifdef DEBUG_L2 printBuffer()

对现有C/C++日志记录解决方案的一些调查结果表明,Pantheios可能是我的情况下最好的,如果禁用日志记录,这是最低的开销

所有的日志记录器似乎都支持打印日志消息。然而,在我的例子中,如果日志记录被禁用,应该避免使用一个函数调用(因为它非常昂贵)

目前,我使用一个非常简单的日志设置,如

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

现在,我真的不喜欢切换到
printf
式语法。宏方法如何处理这个问题(因为它只是用一个类参数模板化的)?

我认为您可以从

glog的典型用法与条件

#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();
}
#包括
{
//初始化日志。有多个选项,请阅读文档
google::InitGoogleLogging();
void*p;

LOG_IF(INFO,p==nullptr)如果您关心性能和运行时开销,请查看库。您可能会喜欢它的一些方面:

  • 它评估日志参数,并仅在必要时(当日志级别允许时)调用实际日志函数
  • 它有运行时日志级别和编译时日志级别。
    log()
    编译时日志级别以下的语句被编译出来,没有运行时开销
  • 运行时日志级别可以在运行时更改,但当消息日志级别低于运行时日志级别时,将不会计算参数,也不会调用实际的日志函数。唯一要计算的是
    if(msg\u log\u level>=runtime\u log\u level)
  • 它的调用站点非常小(每个
    LOG()
    行生成的代码量),比其他库少3-20倍
  • 它不会减慢包含其标题的源代码的编译速度(与某些只包含标题的库不同)

  • 我想到的是C++特定的基于模板的日志记录框架,比如EasyLoglog或SPDLOG。例如,您可以通过实现汇接接口来创建自定义日志目标。另一种(可能更好的)选项是使用它的日志级别特征。 以下是一个示例(复制自spdlog手册):


    通过实现should_log()
可以测试是否启用了指定的日志级别。

请澄清是否可以在运行时更改日志级别(包括从配置文件读取),而不是在中编译
#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();
}
    //
    // 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..");