概述
Google
开源的C++
日志库,专为高性能、高可靠性场景设计,广泛应用于大型分布式系统(如Kubernetes
)
优缺点
优点
- 高性能与线程安全
- 内部采用锁机制保证多线程安全,写入效率高(经
Google
生产环境验证) - 异步
I/O
与缓冲区优化(如syncBuffer
),减少系统调用开销
- 内部采用锁机制保证多线程安全,写入效率高(经
- 灵活的日志控制
- 多级别日志:
INFO
、WARNING
、ERROR
、FATAL
,支持动态调整级别(FLAGS_minloglevel
) - 条件日志:
LOG_IF
(条件触发)、LOG_EVERY_N
(周期记录)、LOG_FIRST_N
(限次记录)
- 多级别日志:
- 自动化日志管理
- 滚动归档:按大小(
SetLogFileSize
)或时间(需自定义扩展)分割日志文件,避免单文件过大 - 多目标输出:同时支持文件、控制台(
FLAGS_alsologtostderr=1
)及自定义路径
- 滚动归档:按大小(
- 强制错误处理机制
CHECK
系列宏(如CHECK_EQ
、CHECK_NE
)替代断言,失败时打印堆栈并终止程序,便于快速定位问题
缺点
- 格式固定不可定制
- 日志前缀格式(如
Lmmdd hh:mm:ss.uuuuuu threadid file:line]
)无法修改,仅能通过回调函数微调
- 日志前缀格式(如
- 功能扩展依赖源码修改
- 不支持按日期归档(需自行实现
dailyRolling
逻辑) - 缺少
DEBUG
级别,需修改源码添加
- 不支持按日期归档(需自行实现
- 初始化约束
- 必须在首个
LOG()
前调用google::InitGoogleLogging()
,否则日志输出到STDERR
- 必须在首个
使用
安装
- 在
vcpgk
安装 32
位mt
静态库
1 |
vcpkg install glog:x86-windows-static |
- 然后把
vcpkg
里面的库和头文件拷贝到项目中来使用
项目
- 示例代码为
debug
模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include "glog/logging.h" #pragma comment(lib, "glog.lib") #pragma comment(lib, "gflags_static_debug.lib") int main(int argc, char* argv[]) { FLAGS_log_dir = "./logs"; //google::InstallPrefixFormatter(&log_cb); if (!google::IsGoogleLoggingInitialized()) { google::InitGoogleLogging(argv[0]); //google::InstallPrefixFormatter(&log_cb); } LOG(INFO) << "log path : " << FLAGS_log_dir; std::cout << "Hello World!\n"; google::ShutdownGoogleLogging(); return 0; } |
VC++
目录
1 2 3 4 5 6 |
// 引用目录 ./glog ./gflags // 库目录 ./lib/debug |
C/C++
1 2 3 4 5 6 7 8 |
// 预处理器 GLOG_USE_GLOG_EXPORT // 代码生成-与项目一致 MTd // 命令行-处理废弃功能错误警告 /sdl /w34996 |
- 链接器-输入
1 2 3 4 |
// 附加依赖项 DbgHelp.lib shlwapi.lib |
日志示例
1 2 3 4 5 |
Log file created at: 2025/06/30 14:54:50 Running on machine: WX Running duration (h:mm:ss): 0:00:00 Log line format: [IWEF]yyyymmdd hh:mm:ss.uuuuuu threadid file:line] msg I20250630 14:54:50.415487 4644 test_dll.cpp:46] log path : ./logs |
核心功能
级别
级别 | 说明 | 示例 |
INFO |
普通信息(如启动成功) | LOG(INFO) << "Service started"; |
WARNING |
潜在问题(如资源不足) | LOG(WARNING) << "Disk full"; |
ERROR |
需修复的错误(如连接失败) | LOG(ERROR) << "DB disconnected"; |
FATAL |
致命错误(程序终止) | LOG(FATAL) << "Memory exhausted"; |
条件日志宏
1 2 3 4 |
int retry = 5; LOG_IF(INFO, retry > 3) << "重试次数过多"; // 条件触发 LOG_EVERY_N(INFO, 10) << "已处理" << google::COUNTER; // 每10次记录 LOG_FIRST_N(WARNING, 2) << "仅前两次输出"; // 限次记录[1,2](@ref) |
检查宏(替代ASSERT
)
1 2 3 4 |
int a = 5, b = 3; CHECK_GT(a, b) << "a必须大于b"; // 大于检查 CHECK_NOTNULL(p); // 指针非空检查 // 失败时打印堆栈并终止程序[1,4](@ref) |
调试日志(Debug
模式专用)
1 2 |
DLOG(INFO) << "调试信息"; // Release模式自动忽略 DCHECK_EQ(x, y) << "x必须等于y"; // 调试期断言[2](@ref) |
日志滚动策略
1 2 |
google::SetLogFileSize(100); // 单个文件最大100MB google::SetLogFilesNum(10); // 保留10个历史文件[8](@ref) |
定义前缀
1 2 3 4 5 |
void log_cb(std::ostream& s, const google::LogMessage& l, void*) { s << "[ " << l.severity() << l.time().year() << l.time().month()<<l.time().day() << " tid =" << l.thread_id() << " ] "; } google::InstallPrefixFormatter(&log_cb); |
声明:本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++程序高级调试与优化_第一篇07/20
- ♥ Soui四05/23
- ♥ Soui五05/30
- ♥ C++并发编程 _ 基于锁的数据结构08/19
- ♥ Soui三05/19
- ♥ C++17_第三篇06/29