spdlog

Adding header-only dependencies with CMake

两盒软妹~` 提交于 2021-02-05 20:28:33
问题 I have a simple project which requires three header-only libraries in order to compile: websocketpp, spdlog and nlohmann/json. The project structure looks like this: └── src ├── app │ ├── CMakeLists.txt │ ├── src │ └── test ├── CMakeLists.txt ├── core │ ├── CMakeLists.txt │ ├── include │ ├── src │ └── test └── vendor ├── install.cmake ├── nlohmann_json ├── spdlog └── websocketpp The root CMakeLists.txt is as follows: cmake_minimum_required(VERSION 3.6.1 FATAL_ERROR) .. # External 3rd party

spdlog 基本结构分析

六月ゝ 毕业季﹏ 提交于 2020-08-07 10:32:54
spdlog 基本结构分析 代码取自 V1.5.0 , 代码堪称美学。 spdlog 是一个只有头文件的C++日志库,速度非常快,扩展性很强,更重要的是 社区活跃,文档齐全 。 使用 参考官方的 example . {fmt} 的格式使用也需要熟悉一下,毕竟也进 C++20 了,什么垃圾流就快扫进历史的垃圾堆吧. 分析 这里选择了三个点来做分析: 提供的 日志格式 非常丰富,并且允许用户自定义需要的格式。 对日志文件的类型也做了充分扩展,支持控制台,普通文件,按大小滚动文件,按时间滚动文件,如果不能满足需要,可以自己扩展格式,见 spdlog/sinks/base_sink.h 。 支持单/多线程,异步/同步,阻塞非阻塞模式。 spdlog 的代码结构如下: spdlog ├─example 用法代码 ├─include 实现目录 │ └─spdlog │ ├─details 功能函数目录 │ ├─fmt {fmt} 库目录 │ ├─sinks 落地文件格式实现 │ └─*.h 异步模式,日志库接口等实现 ├─src .cpp 文件,组成编译模块生成静态库使用 ├─test 测试代码 基本逻辑结构如下: 有几个比较重要的文件: spdlog/spdlog.h 为日志库接口,提供日志宏的属性控制函数。 spdlog/logger.h 为日志管理器,为前后端连接的枢纽。 spdlog

Qt日志重定向qInstallMessageHandler,输出至文件及网络

泄露秘密 提交于 2020-05-05 15:41:04
Qt日志重定向qInstallMessageHandler,输出至文件及网络 https://blog.csdn.net/libaineu2004/article/details/88801336 Qt有Debug、Warning、Info、Critical、Fatal五种级别的调试信息。 qDebug:调试信息 qWarning:警告信息 qInfo:警告信息 qCritical:严重错误 qFatal:致命错误 Qt4提供了qInstallMsgHandler(Qt5:qInstallMessageHandler)对qDebug、qWarning、qCritical、qFatal等函数输出信息的重定向处理。 qInstallMsgHandler是一个回调函数,由qDebug、qWarnng、qCritical、qFatal函数进行触发,qDebug、qWarnng、qCritical、qFatal函数处理的消息文本会被qInstallMsgHandler所指向的回调函数截获,允许用户自己来处理输出的消息文本。 一、来看官方的例子: void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QString text; switch(type) { case

CMake---优雅地构建软件项目实践(1)

青春壹個敷衍的年華 提交于 2020-03-19 19:20:11
3 月,跳不动了?>>> 本文属于原创,转载注明出处,欢迎关注微信小程序 小白AI博客 微信公众号 小白AI 或者网站 https://xiaobaiai.net 或者我的CSDN http://blog.csdn.net/freeape [TOC] 首先说明的是本篇文章不从cmake的整个语法上去讲述,而是从一个实际项目的构建上入手,去了解如何优雅的去构建一个软件项目,搭建一个 C/C++ 软件项目基本的依赖组件,最后形成一个构建 C/C++ 软件项目的模板,方便后面新项目的重复使用。相信对我们日常的软件项目构建都会有很好的收获。废话不都说,开始。 1 我们需要知道的基础 首先熟悉cmake的一些基操,我们就可以信手捏来的、优雅去构建一个项目,避免踩到不必要的坑。涉及到的有: cmake的变量作用域? cmake中的数据结构? 宏函数与函数? 如何去构建动静态库和找到这些库? 如何去实现支持多平台的项目构建? 如何去构建一个应用? 如何实现项目的最后install? 如何很友好的去展示构建过程的各种级别信息? 如何适配cmake-gui,采用友好的ccmake或者cmake-gui实现构建? 这里概括性说明下常用的cmake知识,总的来说cmake的作用就是让我们找到依赖的头文件和库文件,去编译源文件、链接目标文件(静态库也是目标文件的一个集合),最后生成可执行文件或动/静态库:

How to declare static information in scopes accessible to nested lexical scopes in C++?

六月ゝ 毕业季﹏ 提交于 2020-01-02 06:57:09
问题 I want to declare identifiers for scopes which will be used to automatically populate a field of any logging statements within the innermost scope. They will usually, but not always (e.g. lambdas, blocks introduced with {} ), match the "name" of the enclosing block. Usage would look something like this: namespace app { LOG_CONTEXT( "app" ); class Connector { LOG_CONTEXT( "Connector" ); void send( const std::string & msg ) { LOG_CONTEXT( "send()" ); LOG_TRACE( msg ); } }; } // namespace app //

How to declare static information in scopes accessible to nested lexical scopes in C++?

匆匆过客 提交于 2019-12-05 19:53:19
I want to declare identifiers for scopes which will be used to automatically populate a field of any logging statements within the innermost scope. They will usually, but not always (e.g. lambdas, blocks introduced with {} ), match the "name" of the enclosing block. Usage would look something like this: namespace app { LOG_CONTEXT( "app" ); class Connector { LOG_CONTEXT( "Connector" ); void send( const std::string & msg ) { LOG_CONTEXT( "send()" ); LOG_TRACE( msg ); } }; } // namespace app // not inherited LOG_CONTEXT( "global", false ); void fn() { LOG_DEBUG( "in fn" ); } int main() { LOG