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