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

WiseFlow本地搭建实录---保姆教程

本文介绍了如何从0开始搭建wiseflow的个人情报官的方法,目前所有的API全部都是免费的,对机器没有要求,大家可以放心搭建

liuhui244的博客 1962

boost log简介

boost日志库的使用

大草的博客 3987

思科模拟器实战:MQTT协议实现物联网设备通信全流程解析

本文详细解析了如何在思科模拟器中利用MQTT协议实现物联网设备通信的全流程。通过搭建网络拓扑、配置MQTT Broker与客户端,并编写发布/订阅逻辑,手把手指导读者完成一个“开关控制电灯”的经典物联网场景实验,帮助零成本掌握物联网通信核心。

weixin_29294975的博客 381

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 193

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

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

橘嘉禾 422

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

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

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

圈小圈DBA的博客 1440

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 401

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2596

开源日志库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

利用SIMULINK搭建一个16QAM调制解调收发系统

1发送模块设计 根据前面介绍的理论知识,我们可以知道16QAM的基本结构,首先我来设计QAM发送段的SIMULINK仿真模块。 图1 16QAM的发送端模块 他的基本工作流程为:将信号通过两路升余弦滤波器,得到滤波以后的信号,滤波器的作用就是为了防止码间干扰。然后将滤波以后的信号和SIN,COS相乘得到调制信号,将调制 下面一一介绍每个模块的具体参数设置以及各个部分信号的波形图。 图2 产生随机数据的信号源 第一部分信号是产生一组随机的数字,作为信源,第二个模块将信号...

FPGA/MATLAB学习教程/源码/项目合作开发 4776

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

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

码事漫谈 1548

Vue3 - 详解实现网站接入微信扫码登录功能,微信授权生成登录二维码用户用手机扫描二维码登陆,微信扫描二维码登录详细流程及示例代码,支持弹框式、浏览器单独新开页显示,最新vue集成微信扫码授权登录!

vue3,nuxt3,PC网站,网页,微信扫码登录,微信登陆,vue3微信扫码登录,获取个人信息,扫码登录后如何获取用户手机号,微信扫码授权登录,vue3详细实现微信扫一扫登陆,pc网页微信登录,vue3集成微信扫码登录,详细流程和示例源码,第三方扫码登录,vue3微信扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,微信扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描微信二维码登录网站,最好用的插件,vue-wxlo

🏆 前端领域优质创作者 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++开发:日志打印库

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

倔强老吕的博客 1317

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

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

c/c++日志库初识

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

m0_54069809的博客 1267

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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、付费专栏及课程。

余额充值