本文作者:icy

C++ 日志库 glog:Google 开源的高性能日志系统

icy 昨天 19 抢沙发
C++ 日志库 glog:Google 开源的高性能日志系统摘要: C++ 日志库 glog:Google 开源的高性能日志系统 项目概述 glog 是 Google 开发并开源的一个 C++ 日志库,它提供了丰富的日志记录功能,包括分级日志、条件...

C++ 日志库 glog:Google 开源的高性能日志系统

C++ 日志库 glog:Google 开源的高性能日志系统

项目概述

glog 是 Google 开发并开源的一个 C++ 日志库,它提供了丰富的日志记录功能,包括分级日志、条件日志、调试日志等。该项目设计简洁、性能优异,广泛应用于 Google 内部的各种 C++ 项目中,并已成为 C++ 社区中最受欢迎的日志库之一。

核心特性

1. 分级日志系统

glog 支持多种日志级别,便于在不同环境中控制日志输出: - INFO:常规信息 - WARNING:警告信息 - ERROR:错误信息 - FATAL:致命错误(记录后会终止程序)

2. 条件日志记录

可以根据条件决定是否记录日志,避免不必要的性能开销。

3. 调试支持

提供 DCHECK 系列宏,在调试版本中进行断言检查。

4. 灵活的日志目的地

支持将日志输出到文件、标准错误流,并可自定义日志处理器。

5. 性能优化

采用异步日志机制,减少对主程序性能的影响。

安装与配置

安装方法

text
# 克隆项目
git clone https://github.com/google/glog.git
cd glog

# 编译安装
mkdir build && cd build
cmake ..
make
sudo make install

基本配置

在 CMake 项目中集成 glog:

text
find_package(glog REQUIRED)
target_link_libraries(your_target glog::glog)

使用示例

基础使用

text
#include <glog/logging.h>

int main(int argc, char* argv[]) {
    // 初始化 glog
    google::InitGoogleLogging(argv[0]);
    
    // 设置日志目录和前缀
    google::SetLogDestination(google::INFO, "./logs/info_");
    google::SetLogDestination(google::WARNING, "./logs/warning_");
    google::SetLogDestination(google::ERROR, "./logs/error_");
    
    // 设置日志级别
    FLAGS_stderrthreshold = google::INFO;
    FLAGS_minloglevel = google::INFO;
    
    // 记录不同级别的日志
    LOG(INFO) << "这是一条 INFO 级别的日志";
    LOG(WARNING) << "这是一条 WARNING 级别的日志";
    LOG(ERROR) << "这是一条 ERROR 级别的日志";
    
    int value = 42;
    LOG(INFO) << "当前值: " << value;
    
    // 清理资源
    google::ShutdownGoogleLogging();
    
    return 0;
}

条件日志

text
#include <glog/logging.h>

void processData(int* data, size_t size) {
    // 只在条件满足时记录日志
    LOG_IF(INFO, size > 1000) << "处理大量数据: " << size << " 个元素";
    
    // 定期记录日志(每处理100个元素记录一次)
    for (size_t i = 0; i < size; ++i) {
        LOG_EVERY_N(INFO, 100) << "已处理 " << google::COUNTER << " 个元素";
        // 处理数据...
    }
    
    // 前N次记录日志
    LOG_FIRST_N(INFO, 5) << "这是前 " << google::COUNTER << " 次调用";
}

调试检查

text
#include <glog/logging.h>

void validateInput(int value) {
    // 调试版本的断言检查
    DCHECK(value >= 0) << "值不能为负数: " << value;
    DCHECK_EQ(value % 2, 0) << "值必须是偶数: " << value;
    
    // 带消息的检查
    CHECK_NOTNULL(some_pointer) << "指针不能为空";
    CHECK_GE(value, 0) << "值必须大于等于0";
}

自定义日志格式

text
#include <glog/logging.h>
#include <iostream>

class CustomLogSink : public google::LogSink {
public:
    void send(google::LogSeverity severity, const char* full_filename,
              const char* base_filename, int line,
              const struct ::tm* tm_time,
              const char* message, size_t message_len) override {
        
        std::cout << "[" << getSeverityString(severity) << "] "
                  << base_filename << ":" << line << " - "
                  << std::string(message, message_len) << std::endl;
    }
    
private:
    const char* getSeverityString(google::LogSeverity severity) {
        switch (severity) {
            case google::INFO: return "INFO";
            case google::WARNING: return "WARN";
            case google::ERROR: return "ERROR";
            case google::FATAL: return "FATAL";
            default: return "UNKNOWN";
        }
    }
};

int main() {
    google::InitGoogleLogging("custom_logger");
    
    CustomLogSink sink;
    google::AddLogSink(&sink);
    
    LOG(INFO) << "使用自定义格式的日志";
    
    google::ShutdownGoogleLogging();
    return 0;
}

高级配置示例

text
#include <glog/logging.h>

void setupAdvancedLogging() {
    // 设置日志文件最大大小(MB)
    FLAGS_max_log_size = 100;
    
    // 设置日志滚动时保留的文件数量
    FLAGS_logbufsecs = 0;  // 立即刷新日志
    
    // 启用颜色输出(仅终端)
    FLAGS_colorlogtostderr = true;
    
    // 在日志中包含年份
    FLAGS_log_year_in_prefix = true;
    
    // 设置详细日志级别
    FLAGS_v = 2;  // VLOG(2) 及以下级别的日志会被记录
    
    // 详细日志
    VLOG(1) << "这是一条详细级别1的日志";
    VLOG(2) << "这是一条详细级别2的日志";
}

实际应用场景

1. 服务器应用日志

text
class Server {
public:
    void start() {
        LOG(INFO) << "服务器启动中...";
        
        try {
            initializeComponents();
            LOG(INFO) << "服务器启动成功";
        } catch (const std::exception& e) {
            LOG(ERROR) << "服务器启动失败: " << e.what();
            throw;
        }
    }
    
private:
    void initializeComponents() {
        LOG(INFO) << "初始化网络模块";
        // 初始化代码...
        
        LOG(INFO) << "初始化数据库连接";
        // 初始化代码...
    }
};

2. 性能监控

text
class PerformanceMonitor {
public:
    void processRequest(const Request& req) {
        auto start = std::chrono::high_resolution_clock::now();
        
        // 处理请求...
        
        auto end = std::chrono::high_resolution_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
        
        LOG_IF(WARNING, duration.count() > 100) 
            << "请求处理时间过长: " << duration.count() << "ms";
        
        LOG_EVERY_N(INFO, 100) << "已处理 " << google::COUNTER << " 个请求";
    }
};

最佳实践

  1. 合理使用日志级别:根据信息的重要性选择合适的日志级别
  2. 避免过度日志:使用条件日志减少不必要的输出
  3. 包含上下文信息:在日志中提供足够的调试信息
  4. 定期清理日志:配置日志滚动策略,避免磁盘空间耗尽
  5. 生产环境配置:在生产环境中适当提高日志级别阈值

总结

glog 作为一个成熟稳定的 C++ 日志库,提供了丰富的功能和优秀的性能。其简洁的 API 设计、灵活的配置选项和强大的调试支持,使其成为 C++ 项目中日志系统的理想选择。无论是小型工具还是大型分布式系统,glog 都能提供可靠的日志记录解决方案。

通过合理的配置和使用,glog 可以帮助开发者快速定位问题、监控系统运行状态,是提高软件可维护性和可靠性的重要工具。

glog_20260205090400.zip
类型:压缩文件|已下载:1|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://www.zelig.cn/2026/03/402.html发布于 昨天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,19人围观)参与讨论

还没有评论,来说两句吧...