glog使用详解和基本使用示例
glog
是 Google 开源的一个 C++ 日志库,全称 Google Logging Library,适用于大型 C++ 项目,支持等级日志输出(INFO/WARNING/ERROR/FATAL)、日志文件输出、条件日志、调试检查、堆栈追踪等功能。
一、glog 特性简述
- 多级别日志输出:
LOG(INFO)
,LOG(WARNING)
,LOG(ERROR)
,LOG(FATAL)
- 检查宏:
CHECK
,CHECK_EQ
,CHECK_NE
, 等 - 条件日志:
LOG_IF
,LOG_EVERY_N
,LOG_FIRST_N
- 可输出到标准输出、日志文件或自定义路径
- 支持线程安全、堆栈跟踪(FATAL 时)
二、不同环境安装方法
Ubuntu / Debian
sudo apt install libgoogle-glog-dev
Windows + vcpkg
vcpkg install glog
CMake 配置(跨平台)
find_package(glog REQUIRED)
target_link_libraries(your_target PRIVATE glog::glog)
三、基础用法示例
初始化和基本日志
#include <glog/logging.h>int main(int argc, char* argv[]) {google::InitGoogleLogging(argv[0]);// 日志输出等级LOG(INFO) << "这是一个信息日志";LOG(WARNING) << "这是一个警告日志";LOG(ERROR) << "这是一个错误日志";// 致命错误,程序将中止// LOG(FATAL) << "致命错误";return 0;
}
默认日志输出到:
- 屏幕(
stderr
) - 文件:
/tmp/<program>.<severity>.<pid>.log
四、日志等级与控制
设置最小输出等级
FLAGS_minloglevel = 1; // 0: INFO, 1: WARNING, 2: ERROR, 3: FATAL
也可通过命令行参数控制:
./your_program --minloglevel=2
五、检查宏 CHECK
系列(崩溃检查)
int a = 5, b = 3;
CHECK(a > b) << "a 应该大于 b,否则程序终止";
CHECK_EQ(a, 5); // 等于
CHECK_NE(a, b); // 不等于
CHECK_LT(b, a); // 小于
CHECK_GE(a, 5); // 大于等于
- 检查失败会立即终止程序
CHECK_*
会打印出当前行数、错误堆栈
六、条件日志(调试/频率控制)
只在条件为真时打印
int x = 10;
LOG_IF(INFO, x > 5) << "x 大于 5";
每 N 次打印一次
for (int i = 0; i < 100; ++i) {LOG_EVERY_N(INFO, 10) << "第 " << i << " 次";
}
前 N 次打印
for (int i = 0; i < 100; ++i) {LOG_FIRST_N(INFO, 3) << "仅输出前 3 次,第 " << i << " 次";
}
七、自定义日志目录/文件
FLAGS_log_dir = "/your/log/dir";
或者在命令行指定:
./your_program --log_dir=./log
日志文件默认命名为:
<program>.<level>.<hostname>.<user>.log.<timestamp>.<pid>
八、线程安全和性能建议
- glog 日志是线程安全的
- 在多线程程序中可放心使用
- 高性能场景建议控制
LOG_EVERY_N
或禁用 INFO 日志
九、终止时打印堆栈(仅 FATAL
)
当 LOG(FATAL)
或 CHECK
失败时:
- 会自动打印调用堆栈
- 在 Linux 下需支持
backtrace()
,可以通过 glog 的堆栈解析辅助程序查看
十、完整示例代码
#include <iostream>
#include <glog/logging.h>void test_log() {int a = 10, b = 5;LOG(INFO) << "程序启动...";LOG_IF(WARNING, a > b) << "a 大于 b";for (int i = 0; i < 30; ++i) {LOG_EVERY_N(INFO, 10) << "循环中,第 " << i << " 次";}CHECK_EQ(a, 10) << "a 不为 10,出错!";
}int main(int argc, char* argv[]) {// 初始化 gloggoogle::InitGoogleLogging(argv[0]);// 设置日志路径FLAGS_log_dir = "./log"; // 日志文件保存目录FLAGS_alsologtostderr = 1; // 同时输出到终端test_log();// 清理google::ShutdownGoogleLogging();return 0;
}
十一、关闭日志或静默模式
在生产环境中关闭某些日志:
FLAGS_minloglevel = 2; // 仅 ERROR 与 FATAL
FLAGS_logtostderr = 0; // 不输出到终端
FLAGS_alsologtostderr = 0; // 不附加输出
十二、典型 glog 与 gflags 组合(推荐)
glog 常与 gflags 一起使用,用于命令行参数解析:
#include <gflags/gflags.h>
#include <glog/logging.h>DEFINE_string(config, "config.json", "配置文件路径");int main(int argc, char* argv[]) {google::InitGoogleLogging(argv[0]);gflags::ParseCommandLineFlags(&argc, &argv, true);LOG(INFO) << "配置文件:" << FLAGS_config;return 0;
}
总结:何时用 glog?
场景 | 推荐使用 |
---|---|
开发调试日志 | LOG(INFO) 等级 |
检查条件崩溃 | CHECK , CHECK_EQ |
定期日志 | LOG_EVERY_N , LOG_IF |
发布版日志保存 | 设置 --log_dir 输出日志 |
日志静默控制 | 使用 FLAGS_minloglevel |