简 述: 准备在个人的项目中添加 Log 日志模块,便于项目日后定位和调试。因前面数月,有感受到了日志的威力,故决定调研后选取一个合适的日志模块 spdlog 。最后意外的惊喜发现,检索需要一点技巧,可遇村外有村,好风凭借力。

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


关联

  附关联目录直达,随着后续使用,持续更新

  1. Log:日志选型调研『一』
  2. Log:日志之 Spdlog 极简用法示范『二』
  3. Log:日志之 Spdlog 核心构成『三』

背景

  此前的工作主要工作,主要为开发 Deepin 和 WPS 的 UI 样式开发,姑归类为客户端开发,主要使用调试方法如下,对于当时基本够用

  1. qDebug() 终端打印调试
  2. MessageBox 弹出消息框显示调试
  3. Visual Studio / Qt Creator 中源码调试,直接查看当前变量数值显示

  今年主要使用 C++ 的进行非应用界面开发,运用和见识过了 Log 日志模块的威力,简直就是 “大道至简,朴实无华,甚是有用” 。且准备将其引入自己的项目。因一旦选定具体的库作为,后面就不准备更改了,慎重调研一番,做好选型,亦给后来者参考


日志库调研

  我的需求,能够都满足最佳:

  • 能够支持跨平台(Win / Mac / Linux)
  • 可滚动日志,保存多份日志,可自定义日志级别
  • 读写快速,性能较好即可
  • 最好是知名、易用、且有人维护的开源库
  • 许可证比较宽松

  需求已经明确,那么问题来了,又如何去寻找自己所需呢?世界那么大,资源那么多,如何快速🔍自己所需的有效信息?

① Google 搜索框输入第一反应关键词;② GitHub 输入关键词;③ Google + GitHub 寻找现有的框架榜单,精选集和,学会借力。


Google 关键词

  第一反应,在 Google 搜索框中,输入”C++ Log 推荐” 后回车,看他人文章推荐后,逐个了解和其库的现有状态去核对。会遇到,数年前文章,时效性可能已有较大变化。 事后总结: 此类文章快速浏览扫描一遍即可,获取信息耗时比较高。


表格总结
Log 库 Star License Last Commit (截至 2022.03.10) 采纳标记
log4cxx 163 Apache-2.0 5 天前
log4c LGPL 2016.01.20
z-log 1.6k LGPL2.1 2021.12.28
c-log 226 Apache 2.0
syslog-ng 1.6k GPL + LGPL 昨天
Pantheios 35 2020.07.05
Log4Qt 388 Apache-2.0 2022.01.09
blackhole 184 MIT 2018.12.12
Boost.Log v2 142 LICENSE 11 天前
easyloggingpp 3.1K MIT 2021.02.03
fmtlog 291 MIT 19 天前
g3log 735 The Unlicense 昨天
google glog 5.1k COPYING 2 天前
log4cpp LGPL 2017.04.18
log4cplus 1.3k Log4cplus license 2021.12.30
loguru 1.3k public domain 17 天前
plog 1.3k MPL2.0 2022.02.07
reckless 412 LICENSE 2021.04.10
spdlog 14k MIT 4 天前
templog boost 1.0 2013.04.24
quill 573 MIT 2021.08.31

log4cxx

https://github.com/apache/logging-log4cxx

Log4cxx 是开放源代码项目 Apache Logging Service 的子项目之一,是 Java 社区著名的 log4j 的 c++ 移植版,用于为 C++ 程序提供日志功能,以便开发者对目标程序进行调试和审计。


Log4cpp

http://log4cpp.sourceforge.net

Log4cpp 是用于灵活记录文件、系统日志、IDSA 和其他目标的 C++ 类库。它以Log4j Java 库为模型,尽可能接近其 API。


log4c

http://log4c.sourceforge.net

log4c 现已不再有人维护了。不是面向对象的,不支持流式log输入。有配置文件。最新版本(log4c-1.2.4.tar.gz)存在内存泄露。不建议使用


log4cplus

https://github.com/log4cplus/log4cplus

log4cplus 是 C++ 编写的开源的日志系统,前身是 java 编写的 log4j 系统,受 Apache Software License 保护。

作者是Tad E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 你可以选择将信息输出到屏幕、文件、 NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。

补充:log4cplus 默认 8 字节对齐结构,其他对齐结构会内存泄漏


google glog

https://github.com/google/glog

Google Logging (glog) 是一个实现应用程序级日志记录的 C++98 库。该库提供基于 C++ 风格的流和各种帮助宏的日志记录 API,编程使用方式与 c++ 的 stream 操作类似,例:

LOG(INFO) << "Found " << num_cookies << " cookies";  // LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 

1, 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为; 2, 严重性分级,根据日志严重性分级记录日志; 3, 可有条件地记录日志信息; 4, 条件中止程序。丰富的条件判定宏,可预设程序终止条件; 5, 异常信号处理。程序异常情况,可自定义异常处理过程; 6, 支持debug功能。可只用于debug模式; 7, 自定义日志信息; 8, 线程安全日志记录方式; 9, 系统级日志记录; 10, google perror风格日志信息; 11, 精简日志字符串信息。

补充:虽大厂出品,但 google log 不能每天产生一个log或者需要修改里面源码


z-log

https://github.com/HardySimpson/zlog

zlog 是一个可靠、高性能、线程安全、灵活、模型清晰的纯 C 日志库。

实际上,在 C 世界中,对于像 java 中的 logback 或 c++ 中的 log4cxx 这样的应用程序,没有好的日志库。使用 printf 可以工作,但不能轻易重定向或重新格式化。syslog 很慢,专为系统使用而设计。所以我写了zlog。它比 log4c 更快、更安全、更强大。所以可以广泛使用。


spdlog

https://github.com/gabime/spdlog

spdlog 是一个快速的 C++ 日志库,只包含头文件,兼容 C++11。

特性:

非常快只包含头文件无需依赖第三方库支持跨平台 - Linux / Windows on 32/64 bits支持多线程可对日志文件进行循环输出可每日生成日志文件支持控制台日志输出可选的异步日志支持日志输出级别可自定义日志格式


c-log

https://github.com/0xmalloc/c-log

c-log是一个稳定,高效,多线程安全,易用,简单的C/C++ 日志库,在github主页上有丰富的测试case,后续将会推迟直接输出到scribe等集中式日志收集中间件上,帮助用户更好的收集,分析日志 。2017 停止更新。


syslog-ng

https://github.com/syslog-ng/syslog-ng

syslog-ng 是一个增强的日志守护程序,支持广泛的输入和输出方法:syslog、非结构化文本、消息队列、数据库(SQL 和 NoSQL 等)等等。

特征:

接收和发送 RFC3164 和 RFC5424 样式的系统日志消息

接收和发送 JSON 格式的消息

处理任何类型的非结构化数据

使用内置解析器(csv-parser()、db-parser()、kv-parser() 等)对日志进行分类和结构化

规范化、处理和处理流经系统的日志

使用文件、消息队列 (如AMQP)或数据库(如 PostgreSQL 或 MongoDB)移交日志以进行进一步处理

将日志转发到大数据工具(如 Elasticsearch、Apache Kafka 或 Apache Hadoop)


  总结: 多年无人维护的不采纳,优先采用接近于现代 C++ 设计理念,使用人数比较多,文档齐全,,使用方便,许可证宽松的的来日志库来使用。此前是使用 Log4Qt 作为三方库,早期看重可以融合于 Qt ,应该会比较便于开发;后来发更新比慢、使用也比较麻烦,还需要配置文件,昨日已经移除了此模块。改为投入 spdlog 的怀抱,且只需要添加头文件使用,极大的提升了开发的满足感。


GitHub 搜索

  这也是一个大道至简 的方式,效率之高、时效性之强,使用人数之多的一个可靠榜单;优先选择 ⭐ 最多的 spdlog 。且结果来看也和上面方式交叉验证,结论一致。为啥要使用上面那种愚笨的方式获取信息呢?氪!!!


GItHub 村外有村

  还有一种方式搜索,遇到网友前辈指点,结合 Google 关键词 + GitHub 搜索,会发现这么一个东西:


https://github.com/fffaraz/awesome-cpp 『36.3 K ⭐』

A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-… stuff.

一个很棒的 c++(或C) 框架、库、资源和闪亮的东西的列表。灵感来自棒-…的东西。


哇塞(o゜▽゜)o☆,不愧是村外有村,连这种榜单都有,下拉到 #Logging 章节,省时省力,从精选中点进去看一下即可,快速找到符合自己的库。简直点燃了。



https://github.com/sindresorhus/awesome 『193 K ⭐』

😎 Awesome lists about all kinds of interesting topics

😎关于各种有趣主题的精彩列表(和计算有关的主题分类学习资料)


更像是一个宏大的知识面,每一个你所想的资料或者可以在这里找到相关或者启发、但对于我这个 C++ 来说,但还是上面这个 C++ 框架精选目录更适合自己。



总结

  此次搜索总结,除了收获找到了 spdlog 日志库,还感觉到了获取检索方式不同,其能力的所带来的耗时占比差异巨大,虽然此番偶然发现了,但是日后应该刻意练习,使之成思维惯性,此篇文章做完,于我甚是欢心。亦共享之。


成系列地址

QtExamples

欢迎 star ⭐ 和 fork 🍴 这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”