3分钟上手glog:C++日志库的极速入门指南
【免费下载链接】glog 项目地址: https://gitcode.com/gh_mirrors/glog6/glog
你是否还在为C++项目中的日志管理烦恼?手动编写日志代码繁琐易错,第三方库配置又过于复杂?本文将带你3分钟内快速掌握glog(Google Logging Library)的核心用法,从环境配置到高级功能一网打尽,让你的日志系统从混乱到专业只需三步。读完本文你将能够:使用一行代码输出结构化日志、自定义日志输出目标、掌握日志分级与条件记录技巧。
环境准备:1分钟配置
项目集成
glog支持CMake和Bazel两种构建系统,这里以CMake为例展示最快集成方式。在你的CMakeLists.txt中添加以下代码:
cmake_minimum_required (VERSION 3.16)
project (myproj VERSION 1.0)
find_package (glog 0.8.0 REQUIRED)
add_executable (myapp main.cpp)
target_link_libraries (myapp glog::glog)
上述配置来自官方文档,通过find_package自动查找系统中的glog库,并通过glog::glog目标链接到你的项目。
源码获取
如需从源码编译,执行以下命令:
git clone https://gitcode.com/gh_mirrors/glog6/glog
cd glog
mkdir build && cd build
cmake ..
make -j4
sudo make install
核心用法:2分钟实战
初始化与基础日志
在程序入口处初始化glog,然后即可使用LOG()宏输出不同级别的日志:
#include <glog/logging.h>
int main(int argc, char* argv[]) {
// 初始化glog,参数为程序名称
google::InitGoogleLogging(argv[0]);
// 输出不同级别的日志
LOG(INFO) << "程序启动成功"; // 普通信息
LOG(WARNING) << "内存使用率超过80%"; // 警告信息
LOG(ERROR) << "文件读取失败"; // 错误信息
LOG(FATAL) << "数据库连接超时"; // 致命错误,会终止程序
// 关闭日志库(可选)
google::ShutdownGoogleLogging();
return 0;
}
日志级别定义在src/glog/log_severity.h中,从低到高依次为INFO、WARNING、ERROR、FATAL,其中FATAL会导致程序终止。
条件日志与频率控制
glog提供了灵活的日志触发机制,满足复杂场景需求:
// 条件日志:当条件满足时输出
LOG_IF(INFO, user_count > 1000) << "活跃用户突破1000人";
// 频率控制:每10次执行输出一次
LOG_EVERY_N(INFO, 10) << "第" << google::COUNTER << "次请求";
// 条件频率控制:满足条件且每5次执行输出一次
LOG_IF_EVERY_N(WARNING, latency > 500, 5)
<< "第" << google::COUNTER << "次高延迟请求";
// 首次N次执行输出
LOG_FIRST_N(ERROR, 3) << "前3次错误日志";
这些宏定义在src/glog/logging.h中,通过预处理器实现高效的条件判断和计数逻辑。
自定义日志输出目标
glog支持将日志输出到自定义目标,只需继承LogSink类并实现send方法:
#include <glog/logging.h>
#include <iostream>
struct MyLogSink : google::LogSink {
void send(google::LogSeverity severity, const char* /*full_filename*/,
const char* base_filename, int line,
const google::LogMessageTime& /*time*/, const char* message,
std::size_t message_len) override {
// 自定义输出格式
std::cout << "[" << google::GetLogSeverityName(severity) << "] "
<< base_filename << ":" << line << " "
<< std::string(message, message_len) << std::endl;
}
};
int main(int argc, char* argv[]) {
google::InitGoogleLogging(argv[0]);
MyLogSink sink;
google::AddLogSink(&sink); // 注册自定义sink
LOG(INFO) << "这条日志会输出到自定义sink";
google::RemoveLogSink(&sink); // 移除sink
return 0;
}
完整示例可参考examples/custom_sink.cc,该功能允许你将日志同时输出到文件、控制台、网络等多个目标。
高级配置:日志行为控制
命令行参数
glog支持通过命令行参数控制日志行为,无需修改代码:
# 输出到控制台而非文件
./program --logtostderr=true
# 设置日志级别,只输出WARNING及以上级别
./program --minloglevel=1
# 设置日志文件路径
./program --log_dir=/var/log/myapp
# 详细日志级别控制
./program --v=2 # 输出VLOG(2)及以下级别日志
所有可用参数定义在src/glog/flags.h中,包含日志轮转、大小限制、输出格式等配置项。
编译期日志过滤
通过定义GOOGLE_STRIP_LOG宏可以在编译期过滤低级别日志,减少生产环境二进制体积:
// 在包含glog头文件前定义
#define GOOGLE_STRIP_LOG 1 // 保留WARNING及以上级别,过滤INFO
#include <glog/logging.h>
// 以下代码在编译时会被移除
LOG(INFO) << "这条日志在生产环境不会存在";
该宏的工作原理在src/glog/logging.h中有详细说明,通过条件编译实现日志代码的完全移除。
日志格式解析
glog默认输出结构化日志,包含丰富的上下文信息:
I20231106 10:30:45.123456 12345 main.cpp:42] 用户登录成功,ID=123
各字段含义如下:
I: 日志级别(I=INFO, W=WARNING, E=ERROR, F=FATAL)20231106: 日期(年-月-日)10:30:45.123456: 时间(时:分:秒.微秒)12345: 进程IDmain.cpp:42: 文件名和行号用户登录成功...: 日志内容
日志格式定义在src/glog/logging.h的注释部分,包含完整的字段说明。
常见问题解决
链接错误
如果遇到类似undefined reference to google::InitGoogleLogging的错误,通常是因为没有正确链接glog库。确保在CMake中添加了target_link_libraries(myapp glog::glog),或在Makefile中添加-lglog链接选项。
日志文件不生成
检查是否设置了--log_dir参数或FLAGS_log_dir变量,glog需要可写的日志目录。可以通过LOG(INFO) << "日志目录: " << FLAGS_log_dir;输出当前日志目录进行调试。
中文乱码问题
在Windows环境下,默认控制台可能不支持UTF-8编码。可以通过设置环境变量PYTHONUTF8=1或修改控制台编码解决,也可通过自定义LogSink将日志转换为GBK编码输出。
glog作为Google开源的日志库,以其高效、灵活、易用的特点被广泛应用于C++项目中。通过本文介绍的基础用法和高级特性,你可以快速构建专业的日志系统。更多详细内容可参考官方文档目录,包含日志清理、崩溃处理、平台兼容性等深入主题。
【免费下载链接】glog 项目地址: https://gitcode.com/gh_mirrors/glog6/glog
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



