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 << " 个请求";
}
};
最佳实践
- 合理使用日志级别:根据信息的重要性选择合适的日志级别
- 避免过度日志:使用条件日志减少不必要的输出
- 包含上下文信息:在日志中提供足够的调试信息
- 定期清理日志:配置日志滚动策略,避免磁盘空间耗尽
- 生产环境配置:在生产环境中适当提高日志级别阈值
总结
glog 作为一个成熟稳定的 C++ 日志库,提供了丰富的功能和优秀的性能。其简洁的 API 设计、灵活的配置选项和强大的调试支持,使其成为 C++ 项目中日志系统的理想选择。无论是小型工具还是大型分布式系统,glog 都能提供可靠的日志记录解决方案。
通过合理的配置和使用,glog 可以帮助开发者快速定位问题、监控系统运行状态,是提高软件可维护性和可靠性的重要工具。
glog_20260205090400.zip
类型:压缩文件|已下载:1|下载方式:免费下载
立即下载




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