问题标签 [spdlog]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为自定义类型扩展 spdlog
有没有办法spdlog
在使用格式化时扩展以支持自定义结构作为项目{}
?
所以当我有一个
我想要做
代替
c++ - 使用 spdlog (C++) 进行日志记录,记录器未将日志写入文件
我正在尝试在使用 google test 执行测试时将基本信息记录在文本文件中。我的最终目标是记录异常的踪迹。
在我使用 C++11 的项目中,最新版本的 Google 测试通过 CMake 和 spdlog 作为仅标头添加到项目中(添加到项目内的库中)。
出于某种原因,即使在尝试强制刷新之后,记录器也不会写入文件。我已经尝试了来自互联网的不同“快速入门”,但没有什么对我有用。我不认为这可能是一个问题,但一个假设是您不能在 test 的上下文中写入文件。该项目的结构如下:
(*) 目录中的文件是 spdlog/include/spdlog https://github.com/gabime/spdlog/tree/v1.x/include/spdlog中的文件
这是测试类中的代码 logging_test.cpp
。运行测试后check_exception_thrown_equal
没有写入任何内容logger.txt
。可能是什么问题?
c++ - 从控制台 C++ 获取打印的语句
我的程序中有两个记录器。一个是我在 gui 中制作的,一个超级复杂但设计得非常好,可以打印到控制台。我正在尝试从漂亮的控制台记录器获取输出到渲染的记录器。我已经在阳光下尝试了一切来让它工作,但我似乎无法弄清楚(由于我对其他记录器(spdlog)的代码缺乏理解。)我的结论是直接从打印的是最好的方法,但我在网上找不到任何人询问如何做到这一点。我已经看到了一些问题,但他们只是发布代码作为答案,并没有真正解释发生了什么。我的问题:有没有办法从控制台获取打印出来的语句,以及这样做会带来哪些性能问题/并发症。
例如,如果我做std::cout << "hello!" << std::endl;
一些 printf 语句,我希望能够在代码中进一步向下抓取“hello!”。
c++ - 尝试使用 CMake 和 MinGW64 构建时出现多个重新定义错误
我遇到了一个我似乎无法解决的问题。我正在尝试构建一个使用名为 spdlog 的日志库的项目,但是当我在项目中使用它时它不会构建。MinGW64 报告某些功能有多种定义:
现在,我制作了一个单独的项目,以重现此问题所需的最低限度,希望找到解决方案,但我得到了相同的结果。我也尝试过通过 Visual Studio 进行构建,这很有效,尽管创建库的方式当然不同。还尝试了不同版本的 MinGW64,但不幸的是也没有解决它。
为了演示这个问题,这里是这个“最低限度”项目的内容。
我的项目分为 3 个部分:应用程序、第三方和工具。在这种情况下,Third_party 包含 spdlog 存储库的 git 子模块
应用程序包含一个文件 main.cpp,其内容如下
工具包括以下内容:
记录器.cpp
打印机.h
打印机.cpp
为了构建它,我创建了 3 个 cmake 文件。
根 CMakeLists.txt
应用程序 CMakeLists.txt
工具 CMakeLists.txt
最后,我使用以下命令集来构建所有内容:
所以最后,项目的结构如下:
项目
- 应用
- 包括
- 源代码
- CMakeLists.txt
- 工具
- 包括
- 源代码
- CMakeLists.txt
- 第三者
- spdlog 存储库作为 git 子模块
- CMakeLists.txt
当我开始在多个文件中包含 Logger.h 时,问题才开始出现。我希望我已经提供了足够的信息来说明问题。任何帮助将不胜感激!
c++ - 如何公开库的枚举,这样我的代码就不必输入整个命名空间来使用该枚举?
我正在使用一个名为 spdlog 的库进行日志记录。我想围绕库构建自己的 Logger,以便可以选择添加特定于我的应用程序的“额外”功能。
我能够使以下代码正常工作:
如您所见,日志级别可通过命名空间为spdlog::level::level_enum
.
我可能过于复杂了,但是如果我创建自己的 Logger 类,我是否必须期望使用我的记录器的类在其日志记录函数调用中输入整个枚举的命名空间?
c++ - 使用带有基准的异步记录器时 spdlog 的性能相对较低
我是一个缺乏经验的开发人员,并注意到spdlogspdlog::async_factory
允许使用作为第一个模板参数来实例化多线程记录器。
问题
鉴于我下面的测试结果,异步日志记录比同步多线程版本慢,并且随着争用的增加而扩展得更糟,异步实现的目的是什么?
简单的基准测试
- 结果:使用默认队列进行基准测试
由于存储库包含一些简单的基准测试,我首先运行了bench并进行了一些修改:我将线程池队列大小设置为 32768,并使用spdlog::init_thread_pool(1 << 15, 1);
. 我进一步添加了一个使用模板参数的bench_async_logging
版本,如上所示。结果表明,异步版本的性能明显低于普通线程版本。据我所知,同步发生在线程池的成员中,这是一个bench_threaded_logging
spdlog::async_factory
q_type
mpmc_blocking_queue
. 队列通过单个互斥体同步访问,这可能会降低此合成基准测试中的性能,其中包含 10 个生产者线程和 1 个消费者线程。实际系统可能表现出非常不同的行为,但异步版本的吞吐量只有多线程版本的一半,即使只有 1 个生产者线程。通过下面的实验性更改,异步版本在 1 个线程上实现了几乎相同的性能,在 10 个线程上实现了明显更好的性能。
使用无锁有界队列的实验改进
- 来源:https ://github.com/Araeos/spdlog/tree/async-lock-free (见include/mpmp_queue.hpp)
- 结果:使用无锁队列进行基准测试
为了验证假设,我使用了Dmitry Vyukov 在他的博客上提供的无锁有界队列实现,我稍微修改了它。队列没有实现阻塞enqueue
操作,也没有定时dequeue_for
操作。在我MPMCQueueAdapter
的这个队列的适配器中,我只是使用简单的旋转和一些退避机制来实现所需的等待。队列可能很快,但 C++ 原子直到 C++20 才提供标准等待机制。原始的非阻塞enqueue_nowait
表现出不同的行为,因为它替换了队列中最旧的条目,而我的适配器只是尝试将消息排入队列并且如果已满则不执行任何操作。由于这些注意事项,这仅用于性能参考,以了解有多少线程争用可能是这里的一个因素。
尽管基准测试是综合的,并且在实际系统中可能不会发生如此高的争用,但在底层使用无锁队列可以显着提高性能。默认实现的关键可能只是消费者(将消息转发到实际接收器的线程)与生产者相同的互斥锁同步,或者我的测试在某些方面存在严重缺陷。你觉得呢?你有没有什么想法?
测试系统
- 操作系统:Windows 10 x64 版本 1903
- 编译器:Visual Studio 2019 16.4
- 内存:16GB DDR4 3200
- CPU:锐龙2600 6C/12T
- 固态硬盘:三星 850 EVO 250GB
编辑:我为上面的基准测试结果使用了 32768 的队列大小,而不是最初声明的 16384。
cpu-usage - 使用 spdlog 以异步模式登录时,如何设置 spdlog 正在使用的线程的 cpu 亲和性?
我正在使用 spdlog 以异步模式登录。我想将日志记录任务分配给一个 cpu 核心。spdlog 中是否有实现此功能的 API?
c++ - 为什么我不能链接到用柯南安装的 spdlog 库
我有一个简单的 CMake 项目,并尝试使用柯南安装的 spdlog 库(版本 1.5.0)。
但是在构建时出现以下错误:
我不确定问题是来自我的设置、conan 还是 spdlog 库。谁能帮我在哪里看?
我的本地设置:Ubuntu 19.04、QT Creator、Clang 9(在 IDE 和柯南中)、柯南 1.24.0
c++ - spdlog 自定义日志标签
我想根据记录的位置向我的日志输出添加一些额外的数据。例如,我可能有系统 A 和系统 B,都吐出日志数据,但也许我现在只对系统 B 的日志行感兴趣,所以我可以根据标签进行过滤。
在以前的系统中,我有一个看起来像 LOG(level, tag, message) 的日志函数,但我也可以看到一个解决方案,该解决方案可能涉及为每个系统实例化一个带有标签的记录器,该标签将通过管道传输到捕获所有消息的默认记录器. 所以 spdlog::tagged_logger systemALogger("System A");
这几乎是答案,因为记录器可以有名称,我可以使用名称作为标签,但是记录器可以重定向到默认记录器吗?默认记录器有几个接收器,我必须将它们附加到命名的记录解决方案。
所以最后一个问题是,有没有办法在 spdlog 中添加自定义标签来记录消息?