3分钟上手glog:C++日志库的极速入门指南

3分钟上手glog:C++日志库的极速入门指南

【免费下载链接】glog 【免费下载链接】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: 进程ID
  • main.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 【免费下载链接】glog 项目地址: https://gitcode.com/gh_mirrors/glog6/glog

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值