现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34196 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

26 | Easylogging++和spdlog:两个好用的日志库

Easylogging++ 和 spdlog 的输出方式
Easylogging++ 和 spdlog 的行为定制方式
其他功能
使用预编译的方式
使用用户定义的流输出
实现日志文件切换的方法
输出到文件的方法
示例代码
其他功能
示例代码
启用崩溃日志
示例代码
记录程序执行的性能数据
在代码中使用配置文件
配置文件示例
修改输出文件名的方法
示例代码
启用 Unicode 支持
编译链接
示例代码
依赖于标准和系统头文件
两个文件:头文件和源文件
对比 Easylogging++ 和 spdlog
建议根据实际需要进行选择
介绍了 Easylogging++ 和 spdlog
其他
只用头文件吗?
适配用户定义的流输出
日志文件切换
设置输出文件
开始使用
其他
记录崩溃日志
性能跟踪
使用配置文件设置日志选项
改变输出文件名
使用 Unicode
开始使用
概述
[6] Stanford University, NanoLog. https://github.com/PlatformLab/NanoLog
[5] Kjell Hedström, g3log. https://github.com/KjellKod/g3log
[4] Andrey Semashev, Boost.Log v2. https://www.boost.org/doc/libs/release/libs/log/doc/html/index.html
[3] Victor Zverovich, fmt. https://github.com/fmtlib/fmt
[2] Gabi Melman, spdlog. https://github.com/gabime/spdlog
[1] Amrayn Web Services, easyloggingpp. https://github.com/amrayn/easyloggingpp
课后思考
内容小结
spdlog
Easylogging++
参考资料

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
上一讲正文我介绍了两个可以在 C++ 中进行单元测试的库。今天,类似的,我介绍两个实用的日志库,分别是 Easylogging++ [1] 和 spdlog [2]

Easylogging++

事实上,我本来想只介绍 Easylogging++ 的。但在检查其 GitHub 页面时,我发现了一个问题:它在 2019 年基本没有更新,且目前上报的问题也没有人处理。这是个潜在问题,除非你觉得这个库好到愿意自己动手修问题(话说回来,这个库还是不错的,我在这个项目贡献了 8 个被合并的 pull request)。不管怎样,原先说了要介绍这个库,所以我也还是介绍一下。

概述

Easylogging++ 一共只有两个文件,一个是头文件,一个是普通 C++ 源文件。事实上,它的一个较早版本只有一个文件。正如 Catch2 里一旦定义了 CATCH_CONFIG_MAIN 编译速度会大大减慢一样,把什么东西都放一起最终证明对编译速度还是相当不利的,因此,有人提交了一个补丁,把代码拆成了两个文件。使用 Easylogging++ 也只需要这两个文件——除此之外,就只有对标准和系统头文件的依赖了。
要使用 Easylogging++,推荐直接把这两个文件放到你的项目里。Easylogging++ 有很多的配置项会影响编译结果,我们先大致查看一下常用的可配置项:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++日志库Easylogging++和spdlog是两个功能丰富、易于使用的工具。Easylogging++提供了丰富的配置选项,包括启用Unicode支持、多线程支持、性能跟踪功能等,同时还可以通过配置文件来设置日志选项。它还支持记录程序执行的性能数据和崩溃日志。另一个日志库spdlog提供了高性能的日志记录功能,支持多线程环境下的异步日志记录,具有跨平台特性。两者在功能和实现方式上有很大的不同,建议根据实际需要进行选择。spdlog提供了更简单的日志文件切换功能,支持适配用户定义的流输出,可以只使用头文件的方式,也支持预编译的方式。此外,spdlog还提供了多个不同的日志记录器、异步日志记录、输出二进制信息等功能。相比之下,Easylogging++更多地使用了编译时的行为定制,而spdlog主要通过面向对象的方式在运行时修改日志的行为。另外,Easylogging++使用了IO流的方式,而spdlog使用了`std::format`的方式。总的来说,建议在新项目中优先选择spdlog,仅在需要Easylogging++提供而spdlog不提供的功能时才选择Easylogging++。在严肃的项目中,选择哪个日志库是值得认真比较和评估一下的。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 吴先生
    glog, gflags, gtest 我们的工程里都用这些,可不可以比较一下

    作者回复: 你可以跟我的描述比较啊……😎 后面提到的 g3log 就是基于 glog 开发的,但功能、性能都有改进。如果你目前用的觉得够用,是没必要换的。主要是看其他家有没有提供你想要、目前又没有的功能或性能。

    2020-01-31
    4
  • Geek_power
    吴老师,您好,我现在多进程使用spdlog。意思就是多进程使用spdlog向同一个文件写日志,会有两条日志串行的情况,spdlog不支持多进程吗?

    作者回复: 不支持。你在 spdlog 的网页是可以找到相关信息的: https://github.com/gabime/spdlog/issues/937

    2022-02-08
    1
  • 老师,问一个非常基础的问题: CMakeLists 在工程项目中到底该怎么使用? 如何正确的使用第三方库,例如这里的 spdlog。有例子可以查看吗?

    作者回复: 看我的代码示例好了。 https://github.com/adah1972/geek_time_cpp/tree/master/26/spdlog

    2021-04-21
    1
  • 泰伦卢
    之前都在用glog,觉得有必要换成spdlog

    作者回复: 嗯,spdlog看起来是一个很现代、很好用的库。如果不要求Windows的Unicode支持,是挺好(不过,查了下发现glog也不支持Unicode,所以没有变差)。 另外一个选择是 g3log,接口差不多,性能提高,支持异步。

    2020-01-31
    1
  • 干尾巴
    想问一下我专门开一个线程sleep来作为定时执行任务。我可以保证我的这个线程sleep中途不会被唤起。这样有问题吗?

    作者回复: 没看懂你的问题所在。请另开问题,清晰提出你担心可能会发生什么问题。

    2022-09-24归属地:上海
  • 小南
    spdlog不支持unicode么,那如果需要使用中文字符是不是easyloggoin++更合适

    作者回复: 你的中文字符是放在wstring里或wchar_t数组里吗?如果是,那EasyLogging++可能更好些。否则也没啥区别,当成字节流就行。

    2021-08-22
    2
  • 江波 (Jiang, Bo)
    有没有日志库能做比较细粒度的性能测量?比如10纳秒级的。spdlog貌似本身的性能开销就在微秒级。

    作者回复: 这就不是日志库该干的事了。格式化输出的时间都要超过10纳秒(也就大概30个时钟周期)了吧。I/O就更耗时了。要性能测量,数据肯定是不格式化存内存里,最后再输出。

    2021-02-07
  • luke
    有个问题,库用了spdlog,使用这个库的应用也引入了spdlog,造成了冲突,这样怎么解决?库的日志一般怎么处理?

    作者回复: 全部用动态链接(SO/DLL)应该没有问题的。

    2020-12-23
    3
  • Geek5198
    老师,您好,请问spdlog支持日志过期时间配置然后自动删除的功能吗

    作者回复: 看起来目前没有。你需要自己写个 sink 来完成这个功能。

    2020-10-26
  • 宵练2233
    nanolog 是我见过的最快以及日志超级小的logger
    2021-06-29
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部