C++ 日志库 boost::log 以及 glog 的对比

C++Logger日志库的实现 该项目是基于C++实现的简单日志库系统,代码方面大约200多行,比较简单,封装的接口很容易看懂,使用起来也十分方便,通过定义的宏来实现打印输出到日志文件中。 阅读详情

转自: https://yq.aliyun.com/articles/2620


该文章转自阿里ata精选文章,作者为苏樽

日志能方便地诊断程序原因、统计程序运行数据,是大型软件系统必不可少的组件之一。本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog 。
 

设计

boost::log 的设计主要有日志器( Logger )、日志核心( Logging core )、 Sink 前后端( frontend, backend )组成。日志文本以及日志环境由日志器( Logger )负责搜集,日志核心负责处理日志数据(例如全局过滤、将日志记录传递给 Sink ), Sink 前端分为同步、异步以及不考虑线程同步问题的版本,它们负责将日志记录传递给 Sink 后端处理。 Sink 后端负责把日志记录格式化并输出到不同的介质中(例如日志文件、报警以及统计源中)。
boost_log_design
glog 的设计比较简单,核心类由 LogMessage 组成,它负责初始化日志信息(源代码文件名、源代码行号、输出方法,相当于 boost::log 中的 Logger 功能)、将日志信息传递给不同的 Sink (相当于 boost::log 中的 Logging core )。 LogFileObject 为默认文件输出对象,每个 severity 拥有一个此对象,它负责将日志信息格式化并写入文件。 Sink 由用户自定义,负责接收并处理日志消息。它的核心类图如下所示。
glog_class_diagram

功能

严重性分级

boost::log 的默认分级包括 trace, debug, info, warning, error, fatal ,支持自定义分级。而 glog 仅仅支持 INFO, WARNING, ERROR, FATAL ,如果想要扩展严重性分级,需要使用 VLOG 宏,通过全局变量或者命令行来过滤。如果不使用自定义 Sink , glog 默认是以严重性等级将日志分散保存到不同文件中,如果需要将自定义等级( VLOG )输出到文件,需要修改库源码(参考 LogMessage::SendToLog )。如果给 glog 的日志级别设置为 FATAL , glog 在写完日志之后会自动终止程序。

日志过滤

glog 通过设置 stderrthreshold 全局变量或者命令行参数来实现大于等于某个级别的日志记录到 stderr 以及 log 文件中。而 boost::log 支持两层过滤,可以通过 core::set_filter 设置全局过滤器,也能通过 sink::set_filter 设置 sink 过滤器。配合 lambda 表达式 或者函数对象, boost::log 可以生成无论多么复杂的过滤器。(例如只把某个级别的日志写入文件,或者把统计日志、 trace 日志分别重定向到不同的 sink 中,然后输出到不同的介质)。

线程安全

glog 仅支持同步日志。它的写入代码可以参考 LogMessage::Flush ,在写入日志的时候使用了互斥锁,因此性能会受 I/O 速度影响。有两个支持异步日志的非官方 glog 库,他们分别是 g2log 和 g3log ,均采用 C++11 编写。 boost::log 支持 同步和异步 sink ,同步 sink 在将日志传递给 backend 时会加 互斥锁 。 boost::log 的同步异步 sink 切换起来非常方便,只需要修改类型名就可以了。

自定义 sink 功能

boost::log 和 glog 都支持自定义 sink ,可以实现一条日志信息复制分流到多个 sink 进行处理,也可以在 sink 中以不同的格式输出日志。但是 glog 的 sink 没有过滤器,能获取到的信息也有限。而 boost 将日志抽象成 record 对象,不仅仅包含了日志的文本,还可以包含更丰富的自定义属性。

自定义属性功能

有时程序需要记录的信息往往不仅仅包含一条消息,还需要包含执行环境的一些属性(例如网络对端的 IP 地址)。 boost::log 提供了 属性集 功能,属性集不仅仅包括常用的数据(例如计数器、时间、计时器、线程 ID 等信息)还支持自定义属性。用户可以将程序的任意上下文放入日志记录对象中,然后在 sink 中进行处理。而 glog 不支持此功能,它的 sink 能处理的数据都以函数参数的形式提供给回调函数。

自定义日志器( Logger )

glog 支持为不同严重级别的日志设定日志器,可以通过这点来将不同日志级别的日志分散到不同的文件中。 boost::log 也支持自定义日志源,但它不是用来过滤级别的(因为过滤功能用 sink 的 filtering 就够了),它的日志源可以包含 特定环境 的信息(例如在网络连接 network_connection 中的日志源可以携带远程 IP 地址这个属性,这样从那个日志源发出的每一条日志信息都包含此属性)。

滚动日志

glog 通过设置 FLAGS_max_log_size 这个全局变量来实现日志尺寸大小。 boost::log 则支持不同的 sink 按照文件大小、时间等参数来 旋转 。如果想要 glog 支持按照时间旋转日志,需要 改动 源代码。

宽字符支持

boost::log 支持 宽字符 日志, sink 可以通过设置 locale 进行必要的编码转换。而 glog 仅仅支持 const char* 类型的日志消息。

参数配置

glog 的参数配置(例如缓冲日志时间、最大日志大小、日志文件夹)大多以全局变量或者命令行参数的形式,并且它们控制的是全局范围的参数。 boost::log 可以针对不同 sink 设置不同参数。

格式化

除非自定义 sink ,默认情况下 glog 写入文件的格式是固定的(参考 LogFileObject::Write ),而 boost::log 如果想要设置不同的格式,只需要传递一个 formatter 对象给 sink 即可。

调试支持

glog 提供 DLOG 等宏,这些宏在没有定义 NDEBUG 时有效。 boost::log 则需要程序员自己条件输出。通过不同的 sink/filter 可以实现 glog 同样的功能。

条件日志

glog 支持 LOG_IF , LOG_EVERY_N 等条件日志宏。 boost::log 没有提供类似的宏,但是可以通过 filter 实现。

失败信号处理器

在 Linux 操作系统中, glog 提供 google::InstallFailureSignalHandler() 函数,当程序收到诸如 SIGSEGV 等会导致进程终止的信号时, glog 的信号处理器可以输出 stack trace 信息,方便调试。 glog 原生是为 Linux 操作系统准备的,因此对 Windows 的支持很有限,这个功能也不支持。 boost::log 没有实现这个功能。

文档

boost::log 的文档很全面,例程也很丰富, Google 上的资料也很多。 glog 官方只有 一篇 简介,细节问题则分散在开源社区的 issue 中(例如 Rolling File Log ),搜索引擎上的资料也少。
 

其他

  • boost::log 提供很多使用小工具,例如支持日志排序、输出操作、 binary dump 操作( logging::dump(packet.data(), packet.size() 对于输出内存块很方便)。
  • boost::log 支持从 配置文件 中读取日志配置信息,可以通过修改配置文件来修改日志过滤器、格式等配置。
  • 对于不同的输出方式, boost::log 提供了一些现成的 sink backend ,例如输出到 Windows 事件日志、调试器、 Linux syslog 接口、文本文件等。
  • glog 提供了一些类似单元测试的宏,例如 CHECK_EQ, CHECK_NE 等,可以有条件地终止程序, glog 还提供了类似 static_assert 的 GOOGLE_GLOG_COMPILE_ASSERT 。

总结

glog :小巧精简,源代码简洁易懂,便于学习。缺点是不太灵活,扩充功能需要修改库源码。文档资料少。
boost::log :功能丰富,可扩展性强,文档全面。现代化的 C++ 设计,泛型编程思维,值得研究。搜索引擎中的资料也多。缺点是上手慢,体积大。一旦掌握之后,用起来将会得心应手,游刃有余。
 
如果需要丰富的功能(如输出到网络 /XML 、统计功能、更多的个性化设置),建议选择 boost::log 。如果需要快速上手,拿来即用,对功能没有太高的要求,可以选择 glog 。


使用boost::log库实现日志记录的方法 在上述代码中,我们定义了一个枚举类型severity_level来表示日志的不同等级,然后定义了init_logging函数,用于初始化日志输出的格式。在这个函数中,我们首先打开一个记录对象,然后向这个记录对象中写入消息,并将等级与消息关联起来,最后将这个记录推送到日志记录器中。在上面的代码中,我们首先创建了一个带有等级的日志记录器,然后调用init_logging函数来初始化日志输出的格式。至此,我们就成功地使用boost::log库实现了一个简单的日志记录功能。首先,我们需要定义一个日志记录器。 阅读详情

相关推荐

g2log:使用C ++ 11的高效异步记录器

不要让缓慢的磁盘访问使记录器停顿下来。 通过使用g2log异步记录器,您将消除等待瓶颈,而它具有*传统*记录库的可靠性。

C++plog库,轻量级日志框架(日志库)

在使用自动捕获’this’指针技术时,当用户使用日志记录器记录一条消息时,plog库会自动捕获当前对象的指针,并将其添加到日志消息中,以便用户在查看日志时能够识别与对象相关的消息,并更好地理解程序的行为和状态。在使用延迟流评估技术时,当用户使用日志记录器记录一条消息时,不会立即将消息转换为字符串格式,而是将消息的内容保存到一个缓存区中,直到真正需要输出消息时,才将缓存区中的内容格式化为字符串,然后输出到目标位置。这个头文件定义了一个滚动文件输出的日志附加器,可以将日志写入到滚动的日志文件中。

Dontla的博客 7202

如何用Python分析20年投资者情绪数据(附ISI和CICSI完整数据集)

本文提供了一份利用Python分析2003-2023年投资者情绪数据的实战指南。文章详细介绍了如何获取并清洗ISI和CICSI数据集,运用Pandas、Matplotlib等工具进行数据探索、可视化与深度分析,包括趋势分解、成分关联及情绪状态划分,旨在帮助读者掌握从数据到洞察的完整流程,为量化金融研究提供方法论支持。

gpu4optimizer的博客 468

boost log简介

boost日志库的使用

大草的博客 3987

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1670

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

【Logging 日志库】Cpp 日志库 boost::log 以及 glog 的对比

日志能方便地诊断程序原因、统计程序运行数据,是大型软件系统必不可少的组件之一。本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog 。 设计 boost::log 的设计主要有日志器( Logger )、日志核心( Logging core )、 Sink 前后端( frontend, backend )组成。日志文本以及日志环境由日志器(...

橘嘉禾 422

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1303

【C++】CentOS环境搭建-安装C++ spdlog日志库

spdlog:Speed + Log,是一个高速异步日志库,支持多线程和旋转文件日志,适合用于高负载的系统。glog:Google出品,提供了多种级别的日志输出、多个日志目录的分布式日志存储、快速同步日志到磁盘等功能。Boost.Log:由Boost库提供的日志记录工具,支持多个不同的后端日志器,可以定制多种记录格式。log4cxx(log4cplus):Apache开发的一个C++日志库,设计灵活,可通过配置文件进行调整,同时也支持多种输出方式。

圈小圈DBA的博客 1440

【3天快速入门WPF】1-从最简单的xaml开始

首先我们要知道xaml语法中声明即定义,意思就是“见到元素就相当于创建实例”,MainWindow.xaml的主干是一个元素里包含着一个 元素。这段程序就是在定义一个Window类的实例,这个实例的一个组成部分是一个Grid类的实例。

Zy100Papa的博客 1623

MOS五类漏电流与优化策略

分析了五种主要漏电流机制:1)反偏结泄漏,由PN结热激发和隧

硬核科技 442

开源日志库glog spdlog loguru plog Boost.Log log4cpp对比与选择

0开源日志库glog spdlog loguru plog Boost.Log log4cpp哪个稳定性更高 bug更少 根据前面对各个日志库的分析,可以大致判断这几个日志库的稳定性和bug数量: 1. glog:Google出品,历史悠久,代码质量高,稳定性好,bug较少。但功能较简单,更新较慢,新版本可能存在一定bug。总体来说,稳定性高,bug中等。 2. spdlog:开源社区活跃,测试覆盖广,bug修复快,稳定性和bug数量都好。功能适度,学习成本适中,是个不错的日志

jijie_ming的博客 3245

windows版vCenter STS证书替换步骤说明

windows版vCenter STS证书,手动更新步骤

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 1042

C++主流日志库深度剖析:从原理到选型的全维度指南

G3log是一款专注于"崩溃安全"的异步日志库,GitHub星标超4k。其核心设计是"确保崩溃前的日志不丢失":通过将日志事件写入内存队列后,异步写入磁盘,同时注册信号处理器,在程序崩溃时阻塞信号处理流程,确保队列中所有日志都写入磁盘后再退出。核心特性:1)崩溃时自动捕获堆栈信息;2)支持日志轮转和自定义格式;3)跨平台兼容。性能:单线程吞吐量约60万条/秒。适用场景:长时运行的服务(如服务器、监控系统)、对日志完整性要求极高的场景(如金融交易系统)。没有"最好"的日志库,只有"最适配"的日志库。首选推荐。

码事漫谈 1548

BioEmu 扩散模型加速传统分子动力学(MD)模拟

BioEmu 是一种创新的生成式深度学习系统,通过高效采样和准确预测蛋白质的动态机制,为蛋白质科学和药物设计提供了新的工具。它在多构象采样、MD 模拟拟合和蛋白质稳定性预测方面表现出色,同时显著降低了计算成本。BioEmu 的开发为未来蛋白质动态研究和应用奠定了坚实基础。

weixin_42357472的博客 319

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++开发:日志打印库

在C++开发中,日志系统是软件开发中不可或缺的组成部分,良好的日志系统可以帮助开发者快速定位问题、监控程序运行状态。选择合适的日志库可以帮助你更高效地记录信息、警告、错误等日志信息。

倔强老吕的博客 1317

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c/c++日志库初识

本文主要讲c/c++库的实现流程,也会介绍优秀的开源日志库spdlog的基本使用方式

m0_54069809的博客 1267

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

logger(三):其他log库的介绍(&glog的用法)

Glog等一些log库   在写代码的过程中,打log肯定是少不了的,毕竟不能总靠调试来发现问题。我们可以试着使用自己写一些log库,也可以使用现成的log库,成熟的log库非常多,log4cpp、log4cxx、poco.log、boost.log、glog、syslog等等. log4cpp: 开源的C++类库:提供在C++中使用日志和跟踪调试功能,使用log4cpp,可以很便利地将

wentianyao的专栏 5898

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

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

weixin_30530939的博客 356

C/C++log日志库比较

事实上,在C的世界里面没有特别好的日志函数库(就像Java里面的的log4j,或者C++的log4cxx)。C程序员都喜欢用自己的轮子。printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者输出文件。syslog是个系统级别的轮子,不过速度慢,而且功能比较单调。 尝试了几种C/C++ log库,简单记录如下: log4j的衍生品 日志是应用软件中不可缺少的部分,Apache的开...

weixin_30553065的博客 308

C++日志库选型指南:从Qt项目实践到18种方案对比

日志系统是软件开发的“黑匣子”,其核心在于记录程序运行状态,辅助问题诊断与系统监控。其工作原理通常涉及日志采集、格式化、过滤与输出等环节。一个设计良好的日志库能显著提升软件的可维护性与稳定性,尤其在多线程、高性能场景下价值凸显。在C++生态中,日志库选型需权衡性能、功能与集成复杂度。本文聚焦**spdlog**与**glog**等热门方案,结合Qt框架特性,深入探讨异步日志、线程安全等工程实践,为不同应用场景提供系统化的选型决策框架。

weixin_30920853的博客 340

C++项目glog日志库实战:从编译集成到高级配置全解析

日志系统是C++服务端开发中不可或缺的基础组件,用于记录程序运行状态、排查问题与监控系统行为。其核心原理在于将程序执行过程中的关键信息,以结构化的方式输出到文件、控制台或网络等目标。一个设计良好的日志库不仅能提升调试效率,还能通过日志级别控制、异步输出等机制保障生产环境性能。在众多C++日志库中,Google Logging(glog)以其流式API、线程安全以及强大的CHECK断言机制,在历史项目中广泛应用。尽管glog已于2025年归档,但其稳定的代码质量与独特的流式风格,使其在存量项目与特定场景下仍有

hqmln的博客 463
上一篇: log4cplus的使用
下一篇: win7 下ffmpeg release 版本崩溃问题
forfuture3513
博客等级 码龄15年 76粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值