C++|开源日志库log4cpp和glog
文章目录
- `log4cpp` 和 `glog`对比
- 1. **功能对比**
- 2. **易用性和配置**
- 3. **性能**
- 4. **线程安全**
- 5. **日志输出**
- 6. **功能扩展**
- 7. **适用场景**
- 8. **总结**
- 其它开源C++日志库
- 1. **spdlog**
- 2. **easylogging++**
- 3. **Boost.Log**
- 4. **loguru**
- 5. **Poco Logging**
- 6. **Qt Logging (QDebug)**
- 7. **MinLog**
- 8. **dlog**
- 9. **ZLog**
- 总结
log4cpp
和 glog
对比
log4cpp
和 glog
都是用于 C++ 的日志库,它们在功能、设计理念、易用性等方面有所不同。以下是两者的对比:
1. 功能对比
-
log4cpp:
- 是 Apache 提供的一个日志库,功能较为全面,支持多种日志级别和输出目标。
- 日志级别:支持
TRACE
,DEBUG
,INFO
,WARN
,ERROR
,FATAL
等标准日志级别。 - 输出目标:可以输出日志到文件、控制台、套接字、甚至数据库等多种目标。
- 灵活的配置:支持通过配置文件(XML/Properties 文件)进行配置,使得在运行时能够动态调整日志级别和输出目标。
- 线程安全:内部支持线程安全,确保多线程环境下的日志输出。
- 格式化日志:支持多种日志格式的输出,允许用户自定义日志输出格式。
-
glog (Google Logging):
- 由 Google 提供的日志库,设计简单而高效,主要用于 Google 的大规模系统和服务中。
- 日志级别:支持
INFO
,WARNING
,ERROR
,FATAL
,没有TRACE
等详细级别,适合日常日志和错误日志。 - 输出目标:默认支持输出到控制台和文件,文件输出会分割成多个文件(按日期、大小等),也可以通过自定义方式扩展。
- 配置较为简单:没有像
log4cpp
那样的配置文件支持,配置较为简洁,更多的是通过代码进行配置。 - 线程安全:在多线程环境下支持线程安全的日志记录。
- 支持 fatal 错误:
FATAL
错误会导致程序直接退出,这是glog
特有的设计。
2. 易用性和配置
-
log4cpp:
- 配置较为灵活且复杂,尤其是通过配置文件来控制日志输出,适用于需要频繁调整日志输出设置的项目。
- 支持多个日志输出目标,可以将不同级别的日志输出到不同的文件或控制台。
- 需要引入较多的配置文件,开发者可以通过 XML 或 Properties 文件来灵活配置日志输出。
-
glog:
- 配置较为简单,通过编程接口控制日志级别和输出方式,适合快速集成。
- 不支持配置文件的方式,而是更依赖于代码中的设置,可能不如
log4cpp
灵活。
3. 性能
-
log4cpp:
log4cpp
的性能相对较低,因为它提供了更丰富的功能和配置选项。例如,它的日志分发和多输出目标的处理会稍微增加一些性能开销。- 对于频繁的日志操作,
log4cpp
可能会引入一定的性能瓶颈,尤其是在多线程环境中。
-
glog:
glog
设计上更注重性能,它使用了内存池等优化方式来提升性能。在大规模系统中使用时,其性能表现相对更好。glog
对于日志输出的性能进行了优化,尤其是在多线程环境下表现优秀。
4. 线程安全
-
log4cpp:
log4cpp
是线程安全的,通过加锁机制确保多线程环境下不会发生日志输出冲突。- 不同级别的日志在多线程中有独立的输出,不会互相干扰。
-
glog:
glog
也支持线程安全,并且在多线程环境中表现良好。由于glog
的设计简单且高效,它的线程安全实现没有带来明显的性能损失。
5. 日志输出
-
log4cpp:
- 可以灵活配置日志输出,可以指定输出到控制台、文件、滚动日志、套接字等。
- 通过配置文件可以非常精细地控制哪些日志级别输出到哪些目标。
- 支持日志输出的滚动(例如按大小滚动、按日期滚动等)。
-
glog:
- 默认的输出是控制台和文件,并且具有文件滚动机制(按文件大小或日期)。
glog
自动管理日志文件的切割和存储,适合简单的日志管理。
6. 功能扩展
-
log4cpp:
- 功能较为全面,支持非常多的日志目标、格式和过滤机制。对于一些需要非常灵活日志配置的场景,
log4cpp
是一个不错的选择。
- 功能较为全面,支持非常多的日志目标、格式和过滤机制。对于一些需要非常灵活日志配置的场景,
-
glog:
- 功能相对简单,
glog
的重点是高效和稳定,它支持的功能相对有限,但对于大多数日常使用来说已经足够。 - 不像
log4cpp
那样有多种日志目标的支持,但是可以通过扩展和自定义LogSink
来实现扩展。
- 功能相对简单,
7. 适用场景
-
log4cpp:
- 适合于需要复杂日志配置和多目标日志记录的场景,尤其是在配置和管理日志输出时。
- 用于较为复杂的企业级应用,特别是当日志策略较为复杂时。
-
glog:
- 适合高性能和大规模系统,特别是 Google 系统的日志需求。
- 如果需要一个简单高效的日志库,并且不希望在配置上花费太多时间,
glog
是一个不错的选择。
8. 总结
特性 | log4cpp | glog |
---|---|---|
功能 | 丰富,支持多种日志输出目标和高级配置 | 简单,高效,主要关注性能 |
配置 | 灵活,通过文件进行配置 | 主要通过代码配置 |
线程安全 | 支持,较为传统的实现 | 支持,设计上注重性能,线程安全实现较为高效 |
性能 | 相对较低,特别是多线程场景 | 高效,尤其在多线程场景下,性能优秀 |
日志输出 | 灵活,可输出到多种目标,包括文件、控制台等 | 输出到控制台和文件,支持日志文件切割 |
扩展性 | 强大,支持多种日志目标和格式 | 功能较为简单,但可以通过自定义 LogSink 扩展 |
适用场景 | 需要复杂日志配置和多目标的场景 | 高性能、大规模系统,日志需求较简单的场景 |
选择 log4cpp
还是 glog
取决于您的具体需求。如果您需要复杂的日志管理和高度的灵活性,log4cpp
可能更合适;如果您优先考虑性能和简洁的日志配置,glog
会是一个更好的选择。
其它开源C++日志库
除了 log4cpp
和 glog
,还有很多其他开源的 C++ 日志库,以下是一些常见的开源 C++ 日志库及其特点:
1. spdlog
-
简介:
spdlog
是一个非常高效的 C++ 日志库,它支持多种日志输出方式(控制台、文件等),并且具有非常高的性能,适合大规模系统。 -
特点:
- 非常高效,性能非常好,适用于需要高性能日志的场景。
- 支持多种日志级别(
trace
,debug
,info
,warn
,error
,critical
)。 - 支持日志文件滚动(按大小、按日期等)。
- 支持异步日志(可以配置异步日志输出以提高性能)。
- 支持多种格式化方式,支持日志前缀和时间戳。
- 支持自定义输出目标,灵活扩展。
- 轻量级,简单易用。
-
适用场景:需要高效、轻量级且线程安全的日志记录系统。
-
项目链接:spdlog GitHub
2. easylogging++
-
简介:
easylogging++
是一个跨平台的 C++ 日志库,简单易用,并且提供了一些非常强大的功能,如日志文件自动滚动、线程安全等。 -
特点:
- 配置灵活,支持通过代码配置和通过配置文件配置。
- 支持文件日志的自动滚动。
- 支持多线程环境,线程安全。
- 支持多种日志格式,可以自定义日志格式。
- 支持将日志输出到多个目标,如控制台、文件、syslog 等。
- 提供了丰富的日志级别和日志过滤机制。
-
适用场景:需要简单易用、功能强大的 C++ 日志库。
-
项目链接:easylogging++ GitHub
3. Boost.Log
-
简介:
Boost.Log
是 Boost 库的一部分,提供了一套完整的日志记录框架,功能强大且灵活,但使用上相对复杂。 -
特点:
- 完全支持多线程环境,支持异步日志记录。
- 支持日志的灵活格式化、过滤和输出。
- 支持自定义日志级别,支持日志的分割、归档等功能。
- 支持各种日志输出方式(文件、控制台等)。
- 集成到 Boost 库中,具有高度的模块化和扩展性。
-
适用场景:适用于大型项目,特别是那些已经在使用 Boost 库的项目。
-
项目链接:Boost.Log 官方文档
4. loguru
-
简介:
loguru
是一个轻量级的 C++ 日志库,旨在简化日志记录的配置和使用,支持多种输出格式和输出目标。 -
特点:
- 使用简单,配置少,易于集成到现有项目中。
- 支持多种日志级别,如
INFO
,WARNING
,ERROR
,FATAL
。 - 支持将日志输出到多个目标(如控制台、文件)。
- 自动记录日志行号、函数名等信息。
- 支持多线程环境。
- 支持日志文件自动滚动。
-
适用场景:适合需要简单配置和易用性的日志库,适用于快速集成到项目中。
-
项目链接:loguru GitHub
5. Poco Logging
-
简介:
Poco Logging
是Poco
库的一部分,提供了丰富的日志功能,适用于大规模系统,具有较高的灵活性。 -
特点:
- 完整的日志功能,支持日志过滤、日志级别、日志格式等。
- 支持将日志输出到多个目标(控制台、文件、数据库等)。
- 支持异步日志。
- 支持多线程,线程安全。
- 适合与
Poco
的其他模块(如网络、数据库等)一起使用。
-
适用场景:需要全面日志功能,尤其是在使用
Poco
库的项目中。 -
项目链接:Poco GitHub
6. Qt Logging (QDebug)
-
简介:
Qt
框架提供了自带的日志记录工具,QDebug
类用于调试和日志记录,适合与 Qt 项目结合使用。 -
特点:
- 支持多种输出方式,默认输出到控制台。
- 支持自定义输出格式。
- 易于与 Qt 应用程序集成。
- 不支持独立配置或外部日志目标,但非常适合于 Qt 项目中。
-
适用场景:主要适用于使用 Qt 框架的应用程序,尤其是调试和开发阶段。
-
项目链接:Qt Logging Documentation
7. MinLog
-
简介:
MinLog
是一个轻量级、简单易用的日志库,适用于嵌入式或小型项目。 -
特点:
- 非常轻量,没有复杂的配置和依赖。
- 提供日志级别和简单的输出功能。
- 适合嵌入式系统或小型项目,资源有限的环境中使用。
-
适用场景:嵌入式系统或需要轻量级日志库的小型项目。
-
项目链接:MinLog GitHub
8. dlog
-
简介:
dlog
是一个 C++ 日志库,旨在提供高效、简单的日志功能,支持异步日志和多目标输出。 -
特点:
- 高效的异步日志记录,能够减少主线程的负担。
- 支持多种日志级别和日志目标(文件、控制台等)。
- 支持日志文件的自动切割和归档。
-
适用场景:高性能、需要异步日志的项目。
-
项目链接:dlog GitHub
9. ZLog
-
简介:
ZLog
是一个轻量级的 C++ 日志库,注重性能和易用性,适合嵌入式和小型应用。 -
特点:
- 轻量级设计,性能优越。
- 支持多种日志级别和输出格式。
- 可以通过代码配置和调整日志级别。
-
适用场景:嵌入式、需要轻量级和高性能日志的项目。
-
项目链接:ZLog GitHub
总结
不同的 C++ 日志库适用于不同的场景:
- 如果需要 高性能 和 高效的异步日志,可以选择
spdlog
或loguru
。 - 如果项目已经使用了 Boost,
Boost.Log
是一个非常合适的选择。 - 如果需要更 全面的功能,如日志分割、归档等,可以选择
easylogging++
或Poco Logging
。 - 对于 Qt 项目,使用 Qt 自带的
QDebug
会是最方便的选择。 - 如果需要一个 轻量级的 解决方案,
MinLog
或ZLog
是不错的选择。
根据你的需求(性能、功能、配置灵活性、平台支持等)来选择合适的日志库。
相关文章:
C++|开源日志库log4cpp和glog
文章目录 log4cpp 和 glog对比1. **功能对比**2. **易用性和配置**3. **性能**4. **线程安全**5. **日志输出**6. **功能扩展**7. **适用场景**8. **总结** 其它开源C日志库1. **spdlog**2. **easylogging**3. **Boost.Log**4. **loguru**5. **Poco Logging**6. **Qt Logging (…...
React Context 实现全局组件注册
来源于GPT4o:https://ai.openaicloud.cn/?inVitecodeEJSTWFZMQE 第一步:创建全局组件上下文 (GlobalComponentProvider) 我们将创建一个 React Context 和 Provider,用于存储和提供全局组件。 // src/context/GlobalComponentProvider.tsx…...

基于AutoDL云计算平台+LLaMA-Factory训练平台微调本地大模型
1. 注册与认证 访问AutoDL官网:前往 AutoDL官网。 注册账号:完成注册流程。 实名认证:按照要求完成实名认证,以确保账号的合规性。 2. 选择GPU资源 进入算力市场:在官网首页点击“算力市场”菜单。 挑选GPU&#x…...
strdup 函数
strdup 函数是 C 标准库中的一个函数,用于复制一个字符串。它的全称是 "string duplicate"。这个函数在 <string.h> 头文件中声明。strdup 函数会分配足够的内存来存储源字符串的副本,并将源字符串的内容复制到新分配的内存中。然后返回…...

2.9/Q2,Charls最新文章解读!
文章题目:The causal effect of Internet use on rural middle-aged and older adults depression: A propensity score matching analysis DOI:10.1177/20552076241310041 中文标题:互联网使用对农村中老年人抑郁症的因果影响:…...
【未完成】springboot项目实现扫码登录相关逻辑
准备工作 配置redis 引入redis依赖 <dependencies><!-- Spring Data Redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><…...
html、js、css实现爱心效果
好的!我们可以进一步美化这个爱心效果,增加更多动态和视觉吸引力。以下是改进后的代码,包括以下功能: 1. 背景渐变:添加动态背景渐变效果。 2. 爱心阴影:为爱心添加阴影,使其更具立体感。 3. 随…...

【前端】Hexo 建站指南
文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验:https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了,想要分享给同学们一起交流进步,该怎么办?想要搭建一个属于自己的知识库…...

OpenStack基础架构
openstack是一套IaaS云的解决方案,是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术: 这么来看,3个物理机上产生10个虚拟机,所以把服务分散到10个虚拟机上和分散到4个虚拟…...

1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储
文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…...

IPhone16 Plus 设备详情
目录 产品宣传图内部图——前内部图——后设备详细信息 产品宣传图 内部图——前 内部图——后 设备详细信息 信息收集于HubWeb.cn...
埃氏算法C++实现: 快速输出质数( 素数 )
目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 埃氏算法(Eratosthenes Sieve),全称为埃拉托斯特尼筛法,是一种由古希腊数学家埃拉托斯特尼在公元…...
后端的config包中的常用配置
文章目录 一. CorsConfig二. Knife4jConfig三. MyBatisPlusConfig四. RedisTemplateConfig五. RedissonConfig 一. CorsConfig 全局跨域配置 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registr…...
基于亿坊PHP框架构建物联网解决方案的优势分析!
在物联网 (IoT) 领域,选到合适的框架对于整个项目的开展也尤为重要。通常情况下,基于PHP的一些主流框架被用户常选择,今天就带大家了解下基于亿坊PHP框架构建物联网解决方案的优势有哪些? 1、开发效率高 在物联网项目中…...

IoTDB结合Mybatis使用示例(增删查改自定义sql等)
IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,…...
skynet 源码阅读 -- 启动主流程
Skynet 启动主流程分析 Skynet 是一个轻量级、高并发的服务器框架。它在启动时会进行一系列初始化操作,并启动多个不同功能的线程(Monitor、Timer、Worker、Socket),从而实现消息分发、定时器、网络I/O等核心功能。本文主要从 ma…...

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯
目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…...

UDP 广播组播点播的区别及联系
1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...

STM32补充——IAP
0 前置知识: FLASH相关内容:前往STM32补充——FLASH STM32三种烧录方式(看看就行): 1.ISP:In System Programming(在系统编程) 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...

Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南
由于 Jetson 为 ARM64 (aarch64) 的系统架构,所以不能用 pip install 直接安装,需要通过源码编译。 升级系统 JetPack 由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*,并且 JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2࿰…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...