首页 > 技术知识 > 正文

来自Google的Glog是一个应用程序的日志库。它提供基于C++风格的流的日志API,以及各种辅助的宏。打印日志只需以流的形式传给 LOG(level) ,例如:

#include <glog/logging.h> int main(int argc, char* argv[]) { // Initialize Googles logging library. google::InitGoogleLogging(argv[0]); // … LOG(INFO) << “Found ” << num_cookies << ” cookies”; }

Glog定义了一系列的宏来简化记录日志的工作。你可以:按级别打印日志,通过命令行控制日志行为,按条件打印日志,不满足条件时终止程序,引入自定义的日志级别,等等。 日志级别 可以指定下面这些级别(按严重性递增排序): INFO, WARNING, ERROR, and FATAL 。打印 FATAL 消息会在打印完成后终止程序。和其他日志库类似,级别更高的日志会在同级别和所有低级别的日志文件中打印。

DFATAL 级别会在调试模式(没有定义 NDEBUG 宏)中打印 FATAL 日志,但是会自动降级为 ERROR 级别,而不终止程序。

如果不指定的话,Glog输出到文件 /tmp/…log..-. (比如 /tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474)。默认情况下,Glog对于 ERROR 和 FATAL 级别的日志会同时输出到stderr。 设置flag 一些flag会影响Glog的输出行为。如果安装了GFlags库,编译时会默认使用它,这样就可以在命令行传递flag(别忘了调用 ParseCommandLineFlags 初始化)。比如你想打开 –logtostderr flag,可以这么用: ./your_application –logtostderr=1 如果没有安装GFlags,那可以通过环境变量来设置,在flag名前面加上前缀 GLOG_ 。比如: GLOG_logtostderr=1 ./your_application 常用的flag有:

logtostderr ( bool ,默认为 false ) 日志输出到stderr,不输出到日志文件。 colorlogtostderr ( bool ,默认为 false ) 输出彩色日志到stderr。 stderrthreshold ( int ,默认为2,即 ERROR ) 将大于等于该级别的日志同时输出到stderr。日志级别 INFO, WARNING, ERROR, FATAL 的值分别为0、1、2、3。 minloglevel ( int ,默认为0,即 INFO ) 打印大于等于该级别的日志。日志级别的值同上。 log_dir ( string ,默认为 “” ) 指定输出日志文件的目录。 v ( int ,默认为0) 显示所有 VLOG(m) 的日志, m 小于等于该flag的值。会被 –vmodule 覆盖。 vmodule ( string ,默认为 “” ) 每个模块的详细日志的级别。参数为逗号分隔的一组 = 。 支持通配(即gfs*代表所有gfs开头的名字),匹配不包含扩展名的文件名(忽略 .cc/.h./-inl.h 等)。 会覆盖 –v 指定的值。

logging.cc 中还定义了其他一些flag。grep一下 DEFINE_ 可以看到全部。

也可以通过修改 FLAGS_* 全局变量来改变flag的值。

LOG(INFO) << “file”; // Most flags work immediately after updating values. FLAGS_logtostderr = 1; LOG(INFO) << “stderr”; FLAGS_logtostderr = 0; // This wont change the log destination. If you want to set this // value, you should do this before google::InitGoogleLogging . FLAGS_log_dir = “/some/log/directory”; LOG(INFO) << “the same file”;

按条件/次数打印日志 有时你可能只想在满足一定条件的时候打印日志。可以使用下面的宏来按条件打印日志: LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”; 上面的日志只有在满足 num_cookies > 10 时才会打印。 另一种情况,如果代码被执行多次,可能只想对其中某几次打印日志。 LOG_EVERY_N(INFO, 10) << “Got the ” << google::COUNTER << “th cookie”; 上面的代码会在执行的第1、11、21、…次时打印日志。 google::COUNTER 用来表示是哪一次执行。 可以将这两种日志用下面的宏合并起来。

LOG_IF_EVERY_N(INFO, (size > 1024), 10) << “Got the ” << google::COUNTER << “th big cookie”;

不只是每隔几次打印日志,也可以限制在前n次打印日志: LOG_FIRST_N(INFO, 20) << “Got the ” << google::COUNTER << “th cookie”; 上面会在执行的前20次打印日志。 调试模式 调试模式的日志宏只在调试模式下有效,在非调试模式会被清除。可以避免生产环境的程序由于大量的日志而变慢。

DLOG(INFO) << “Found cookies”; DLOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”; DLOG_EVERY_N(INFO, 10) << “Got the ” << google::COUNTER << “th cookie”;

猜你喜欢