条件输出
glog定义了一系列具有逻辑控制条件的日志函数来控制日志输出。常用的几个如下:
- 条件输出
int num_cookies=11;
LOG_IF(INFO, num_cookies>10) <<"Got lots of cookies";
- 间隔输出
for(int i = 0; i < 100; i++)
{
//在google::COUNTER 等于 1、11、21... 时输出
LOG_EVERY_N(INFO, 10) << "LOG_EVERY_N " << google::COUNTER << "th";
}
//另一个间隔输出,google::COUNTER 已重置0
LOG_EVERY_N(INFO, 10) << "another LOG_EVERY_N " << google::COUNTER << "th";
- 条件间隔输出
for(int i = 0; i <= 100; i++)
{
//在条件为真时,做一次计数,然后到达指定间隔时输出。
//在google::COUNTER 等于 0、100 时输出
LOG_IF_EVERY_N(INFO, i % 10 == 0, 10) << "LOG_IF_EVERY_N " << google::COUNTER << "th";
}
//这个 google::COUNTER 还是有点意思的,每个LOG输出语句都有一个自己的COUNTER,从0开始计数
LOG(INFO) << "LOG " << google::COUNTER << "th";
- 输出前N条日志
for(int i = 0; i < 100; i++)
{
//输出前 10 条日志
LOG_FIRST_N(INFO, 10) << "LOG_FIRST_N " << google::COUNTER << "th";
}
- 基于时间间隔的输出。
不是严格的定时输出,而是一种超时比较的机制进行采样输出。
for(int i = 0; i < 100; i++)
{
//单位是秒
//1 us 的间隔输出,粒度很小,所有i值都打印了。
//这里也可以观察到,日志打印太频繁也影响了计数循环的性能
//LOG_EVERY_T(INFO, 0.000001) << "LOG_EVERY_T 1 us,i:" << i ;
//5 us 间隔较大,i值 随机跳跃打印
LOG_EVERY_T(INFO, 0.000005) << "LOG_EVERY_T 5 us,i:" << i ;
}
调试模式支持
日志输出本身是对性能有所损耗的,可以控制仅在 debug 模式输出影响性能的日志。具体方式是使用 D 前缀的相关日志函数。
涉及两个宏定义 NDEBUG 和 DCHECK_ALWAYS_ON
需要在 #include <glog/logging.h> 前添加宏定义,或者在编译时指定 -DNDEBUG
根据 logging.h line 538 :#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
若定义 NDEBUG 并且没有定义 DCHECK_ALWAYS_ON,则为非 debug模式,D开头的方法将失效
若没有定义 NDEBUG 或者 定义 NDEBUG 但是也定义 DCHECK_ALWAYS_ON ,则为 debug模式,D开头的方法将生效
//控制标识设置 非debug模式
#define NDEBUG
#include <glog/logging.h>
void function()
{
//此时不会输出
DLOG(INFO) << "DLOG Found cookies";
DLOG_IF(INFO, num_cookies > 10) << "DLOG_IF Got lots of cookies";
DLOG_EVERY_N(INFO, 10) << "DLOG_EVERY_N Got the " << google::COUNTER << "th cookie";
}
2744

被折叠的 条评论
为什么被折叠?



