C++ glog高级封装与实战应用指南

C++日志库终极对决:glog与Abseil Logging深度对比与选型指南 日志系统是C++项目中不可或缺的“黑匣子”,负责记录运行时状态与排查问题。其核心原理在于将程序执行过程中的关键信息持久化,技术价值在于提升系统的可观测性与可维护性。在工程实践中,高性能与灵活控制成为关键需求,特别是在多线程、高并发场景下,日志库的架构设计直接影响性能开销与调试效率。应用场景涵盖从嵌入式系统到大型分布式服务,开发者需根据项目规模与长期维护成本进行技术选型。本文聚焦Google系两大日志库,针对**glog的实用主义单例模式**与**Abseil Logging的现代组件化设计**展开深度解析, 阅读详情

1. glog基础入门与编译安装

第一次接触glog时,我被它的简洁API惊艳到了。这个由Google开源的C++日志库,用起来就像cout一样自然,却能自动处理多线程、日志分级等复杂问题。先说说怎么把它装到你的项目里。

最省心的方式是使用vcpkg:

vcpkg install glog

如果你习惯源码编译,这里有个小技巧:在CMakeLists.txt里加上这两行能避免常见的链接问题:

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

我最近在Windows上实测时发现,用VS2019编译x64版本特别顺畅。记得勾选"动态链接运行时库"选项,否则容易遇到运行时冲突。编译完成后你会得到:

  • include/glog/ 头文件目录
  • libglog.lib 静态库
  • libglog.dll 动态库

2. 日志级别与基础用法

glog的日志分级设计非常实用,就像给日志消息贴上了紧急程度标签:

LOG(INFO) << "用户登录成功";      // 蓝色提示
LOG(WARNING) << "内存使用超过80%"; // 黄色警告
LOG(ERROR) << "数据库连接失败";    // 红色错误

但要注意FATAL级别的小陷阱:

LOG(FATAL) << "核心组件崩溃";  // 记录日志后会终止程序!

实际项目中我推荐这样初始化:

google::InitGoogleLogging(argv[0]);
FLAGS_logtostderr = 1;  // 开发阶段先输出到控制台

3. 高级封装实战:线程安全日志助手

直接使用原生API在多线程环境下不够优雅。下面这个封装类是我在金融项目中验证过的方案,解决了三个痛点:

  1. 线程安全问题
  2. 日志文件自动分割
  3. 跨平台路径处理

核心代码结构:

class ThreadSafeLogger {
public:
    static ThreadSafeLogger& GetInstance() {
        static ThreadSafeLogger instance;
        return instance;
    }
    
    void Init(const std::string& log_dir, 
              bool daily_rotate = true,
              int max_size_mb = 1024);
    
    template<typename T>
    void Log(LogLevel level, const T& message) {
        std::lock_guard<std::mutex> lock(mutex_);
        LOG(level) << "[Thread:" << std::this_thread::get_id() << "] " 
                  << message;
    }

private:
    std::mutex mutex_;
    //...其他私有成员
};

使用示例:

auto& logger = ThreadSafeLogger::GetInstance();
logger.Init("/var/log/myapp");
logger.Log(INFO, "交易处理开始 amount=" + std::to_string(amount));

4. 自定义日志格式与输出控制

glog默认格式是这样的:

I20240715 14:25:03.123456 7890 main.cpp:15] 消息内容

通过修改FLAGS可以调整显示效果:

FLAGS_log_prefix = false;  // 去掉前缀
FLAGS_colorlogtostderr = true;  // 彩色输出

更高级的定制需要继承LogSink类。比如我们需要JSON格式日志:

class JsonLogSink : public google::LogSink {
public:
    void send(google::LogSeverity severity, 
             const char* full_filename,
             const char* base_filename,
             int line,
             const tm* tm_time,
             const char* message,
             size_t message_len) override {
        json log = {
            {"timestamp", FormatTime(tm_time)},
            {"level", GetLevelString(severity)},
            {"file", base_filename},
            {"line", line},
            {"message", std::string(message, message_len)}
        };
        std::cout << log.dump() << std::endl;
    }
};

5. 性能优化技巧

在大流量场景下,我总结出这些优化经验:

  1. 异步日志:使用google::base::Logger派生类实现后台写入
class AsyncLogger : public google::base::Logger {
    void Write(bool force_flush, time_t timestamp, 
              const char* message, int length) override {
        queue_.Push(LogItem{timestamp, std::string(message, length)});
        if (force_flush) Flush();
    }
    //... 实现队列处理逻辑
};
  1. 避免频繁的磁盘IO:
FLAGS_logbuflevel = google::GLOG_WARNING;  // INFO级日志缓冲
FLAGS_logbufsecs = 5;  // 最多缓冲5秒
  1. 日志文件管理:
FLAGS_max_log_size = 100;  // 单个文件最大100MB
FLAGS_stop_logging_if_full_disk = true;

6. 跨平台问题解决方案

在Linux和Windows混合环境中,这几个坑我帮你踩过了:

路径分隔符问题:

std::string path = 
    #ifdef _WIN32
    "logs\\app_";
    #else
    "logs/app_";
    #endif

UTF-8编码处理:

#ifdef _WIN32
#include <windows.h>
std::wstring Utf8ToWide(const std::string& utf8) {
    // Windows下的宽字符转换
}
#endif

信号安全日志:

void SignalHandler(const char* data, int size) {
    RAW_LOG(ERROR, "Crash detected: %.*s", size, data);
}
google::InstallFailureSignalHandler();

7. 实战案例:微服务日志系统

去年我们给电商系统设计的日志方案是这样的:

  1. 架构设计:
  • 每个服务实例本地写日志文件
  • 通过Filebeat收集到ELK集群
  • 关键错误触发企业微信告警
  1. 关键配置:
// 服务启动时
logger.Init("/data/logs/order_service", 
           /* daily_rotate */ true,
           /* max_size_mb */ 2048);

// 关键路径添加追踪ID
LOG(INFO) << "[TraceID:" << trace_id << "] 订单创建开始";
  1. 异常处理:
try {
    ProcessPayment();
} catch (const std::exception& e) {
    LOG(ERROR) << "支付处理异常: " << e.what()
              << "\n堆栈:\n" << GetStackTrace();
    NotifyAlertSystem();
}

这套系统每天处理超过200GB日志,平均延迟小于50ms,通过合理的日志分级和采样策略,既保证了可观测性,又没有影响系统性能。

C++封装RabbitMQ客户端:基于AMQP-CPP实现线程安全与延迟队列 消息队列是现代分布式系统中实现应用解耦、异步通信和流量削峰的核心组件。其基本原理是通过生产者-消费者模型,在不同服务或进程间可靠地传递数据。在众多消息队列技术中,RabbitMQ凭借其实现了AMQP协议、高可靠性和丰富的功能特性,成为企业级应用的热门选择。对于C++开发者而言,直接使用原生AMQP-CPP库虽然功能强大,但往往面临线程安全、资源管理和高级功能(如延迟队列)实现复杂等工程挑战。一个设计良好的客户端封装库,能够将底层协议细节、网络IO事件循环(如libev)和复杂的队列声明逻辑进行抽象,为上层业 阅读详情

相关推荐

C++高性能日志库选型指南:spdlog、glog与easylogging++对比与实践

日志是软件系统中用于记录运行时状态、追踪问题和监控性能的核心基础设施。其基本原理是将程序执行过程中的关键信息,按照不同级别(如DEBUG、INFO、ERROR)输出到控制台、文件或远程服务器。一个设计良好的日志系统能实现低延迟、高吞吐的异步写入,并与业务逻辑解耦,从而在几乎不影响主程序性能的前提下,提供完整的运行轨迹。在C++开发领域,日志库的技术价值尤为突出,它直接关系到服务端应用的稳定性、多线程调试的便利性以及线上问题的快速定位。无论是开发高性能服务器、桌面应用还是嵌入式系统,一个可靠的日志模块都是保障

www.itmmd.com 366

C++日志库选型指南:glog与spdlog性能、API与生态深度对比

日志系统是软件开发和系统运维中的关键基础设施,用于记录程序运行状态、排查故障和分析性能。其核心原理是将程序执行过程中的关键事件以结构化格式持久化存储,便于事后追溯。在技术价值上,一个高效的日志库能显著降低系统调试难度、提升运维效率,并保障线上服务的稳定性。常见的应用场景包括后端服务监控、嵌入式系统调试和高性能计算任务追踪等。本文聚焦于C++生态中两个主流解决方案:glog以其在大型分布式系统中的稳定性和与Google基础设施的深度集成著称;而spdlog则凭借其异步日志机制和极致的性能优化,成为现代C++项

weixin_30530939的博客 358

告别C1189:手把手教你正确配置vcpkg管理的glog 0.7.0+版本(动态库专用)

本文详细解析了使用vcpkg管理glog 0.7.0+动态库时遇到的C1189错误及其解决方案。从vcpkg安装配置到项目级最佳实践,提供了四种系统化方法解决GLOG_USE_GLOG_EXPORT宏缺失问题,并深入探讨动态库的运行时路径、符号导出机制等进阶考量,帮助开发者彻底掌握glog动态库的配置技巧。

weixin_29007135的博客 161

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

你是否还在为C++项目中的日志管理烦恼?手动编写日志代码繁琐易错,第三方库配置又过于复杂?本文将带你3分钟内快速掌握glog(Google Logging Library)的核心用法,从环境配置到高级功能一网打尽,让你的日志系统从混乱到专业只需三步。读完本文你将能够:使用一行代码输出结构化日志、自定义日志输出目标、掌握日志分级与条件记录技巧。 ## 环境准备:1分钟配置 ### 项目集成 g

gitblog_00280的博客 835

告别glog/spdlog?手把手教你用ZLToolKit的日志模块重构你的C++项目

本文详细介绍了如何从glog/spdlog迁移到ZLToolKit的日志模块,包括其轻量级设计、异步写入机制和多通道支持等核心特性。通过实战指南和性能对比,帮助开发者高效重构C++项目日志系统,提升性能和扩展性。

weixin_30908941的博客 413

拆解爆火AI图文日报!用扣子(Coze)工作流,10分钟实现自动化新闻早报

当用户提供一则新闻内容时,仔细分析新闻中的关键信息。提取新闻事件的核心要点,包括事件主体、发生时间、地点、主要情节等。用简洁的语言对新闻进行总结,控制在[X]字以内(可根据实际需求设定字数限制)。若用户提供多条新闻,对比各新闻之间的异同点。从事件类型、影响范围、发展趋势等方面进行分析。综合总结多条新闻的整体情况,以有条理的方式呈现给用户。

一身都是月 2428

GLOG从入门到入门

google日志系统glog库的说明

耳东小白的小笔记本儿 1万+

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

C++ glog使用教程与代码演示

C++ glog使用教程

琅嬛福地 6373

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化

本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。

ooo22的博客 520

避坑指南:ShardingSphere连接达梦/金仓数据库时SQL解析器的那些‘坑‘

本文深入探讨了ShardingSphere与国产数据库(如达梦、金仓)集成时遇到的SQL解析器差异问题,提供了详细的解决方案和优化策略。通过分析SQL方言差异、JDBC实现差异及解析器兼容性,帮助开发者有效避坑,提升分布式数据库架构设计的效率与稳定性。

weixin_29309475的博客 392

C++ Windows下Glog日志库安装使用教程

2018年是我写过一个关于Glog使用的教程(https://blog.youkuaiyun.com/qq_27278957/article/details/84648912),但是最近再使用时,发现和当时使用方法有所不同,所以再重新整理一份。 一、简述 Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种助手宏。 二、环境 windows 10 + vs2017 + Glog v0.5.0+ cmake 三、安装Glog 1、在Glog官方中下载Glog代码,.

qq_27278957的博客 7552

告别老旧内核!手把手教你为Android 10设备手动更新WebView(以升级至97版为例)

本文详细指导如何在Android 10设备上手动更新WebView至97版,解决老旧内核导致的兼容性、性能和安全问题。通过ADB命令和图形化操作两种方案,无需Root即可完成升级,显著提升网页加载速度和安全性。

weixin_28672681的博客 583

C++开源日志库--Glog的使用

公司其他同事大多做C#的,公司内部暂时也没用提供自己的C++日志库,由于项目较紧急,所以就准备选一个开源日志库使用,由于以前做过java,用的Log4j比较强大,但是查了下,其使用起来有点复杂。所以就想到最伟大的公司google了,其Glog使用还是比较简单的,源码下下来直接用VS编译生成lib和dll库,源码文件中都有现成的vs工程。 开源项目首页:https://code.googl

莫问收获、敢问耕耘 1万+

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 65

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1400

google glog介绍与使用

【前言】 本文简介了glog及其使用方法,转载自轻典的文章glog 。 一、安装配置 1、简介   google 出的一个C++轻量级日志库,支持以下功能: ◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为; ◆ 严重性分级,根据日志严重性分级记录日志; ◆ 可有条件地记录日志信息; ◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件; ◆ 异常信号处理。

Solomon1558的专栏 1万+

YOLOv11改进策略【Conv和Transformer】| IJCAI 2024 利用FreqFormer中的SFA 空间 - 频率注意力和CTA 通道转置注意力 二次改进C3k2

在FreqFormer模型中,SFA(Spatial-Frequency Attention)和CTA(Channel Transposed Attention)模块是关键组成部分,它们针对传统Transformer在图像超分辨率任务中的不足而设计,旨在更好地恢复高频细节,提升模型性能。

Limiiiing的博客 761

C++日志库glog归档:核心特性解析与现代化迁移指南

日志系统是软件开发和运维中的关键基础设施,用于记录程序运行状态、追踪错误和监控性能。其核心原理是通过不同严重性级别(如INFO、WARNING、ERROR)对信息进行分类输出,并采用高效的I/O策略确保记录过程不影响主程序性能。在C++生态中,日志库的技术价值在于提供类型安全、高性能且易于集成的记录方案,广泛应用于服务器后端、嵌入式系统和大型基础设施项目。随着技术演进,经典的Google Logging Library(glog)因代码库老化和生态整合需求,已被官方归档并推荐迁移至现代替代方案。本文聚焦于g

congdi7904的博客 474

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

别再被CMake的FindPackage搞懵了!以Glog为例,彻底搞懂Config模式与Module模式的区别与配置

本文深入解析CMake的Config模式与Module模式在依赖管理中的区别与配置方法,以Glog为例解决常见的'找不到包'报错问题。通过实战演示和高级技巧,帮助开发者掌握现代CMake依赖管理的最佳实践,提升C++工程效率。

weixin_30664051的博客 383

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

golang日志库glog解析

golang日志库glog解析、vlog简介、每天自动切割日志文件、 设置等级控制日志的输出

技术宅,专注云原生、Go、Linux、Java等技术分享,原创文章、效率工具、实战解决方案!关注我,了解互联网动态,学 IT 不迷路 2230

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Glog日志模块

自己原本想写一个关于日志记录的库文件以用于加速项目开发与调试,无意中了解到Google的日志模块Glog,特找来学习一下。Google Logging Libraryglog托管在Github,可以自行下载,适用于多平台的操作系统,是用C++实现的应用程序级别的日志库,可以下载下来直接使用,非常方便。官方使用代码示例#include <glog/logging.h>int main(int argc

对酒当歌,人生几何。譬如朝露,去日苦多 1941

Glog 0.7.0 跨平台编译实战:Windows/Linux 双系统 5 步配置指南

本文详细介绍了Glog 0.7.0日志库在Windows和Linux双系统下的跨平台编译配置指南。通过5个标准化步骤,包括环境准备、构建系统配置、编译安装、项目集成及验证,帮助C++开发者高效解决跨平台环境差异问题,提升开发效率。

weixin_30696427的博客 430

告别日志混乱:用glog和log4cplus构建C++项目的日志骨架(附配置文件模板)

本文详细介绍了如何使用glog和log4cplus构建C++项目的日志系统框架,提供配置文件模板和实战指南。通过对比两种日志库的特点和适用场景,帮助开发者根据项目需求选择合适的日志解决方案,提升代码可维护性和调试效率。

weixin_30617797的博客 485

Glog

Glog的简单入门,glog虽然在配置参数方面比较麻烦,但是在小规模程序中,由于其简单灵活,也许会有优势。 0, glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善。 结合之前看的一些资料, 这里简单对其做个简介。 1, 安装: 最新版本:0.3.1 http://code.google.com/p/google-glog/ 安装...

weixin_33940102的博客 126
上一篇: 100、PowerPoint演示文稿创建与展示全攻略
下一篇: 【STM32H7实战指南】ADC多通道扫描与DMA传输的高效实现
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值