Qt结合spdlog库实现日志记录入门指南

1 下载量 187 浏览量 更新于2024-11-08 收藏 1.82MB 7Z 举报
资源摘要信息:"spdlog入门教程(1)"是一份关于如何在Qt环境下使用 spdlog 进行日志记录的教程。spdlog 是一个高性能、开源的 C++ 日志库,广泛应用于软件开发中进行日志的记录、管理与分析。本教程假设读者已经具有一定的Qt和C++编程基础,主要目的是指导初学者快速上手spdlog库,并结合实际的Qt项目演示如何集成和使用spdlog进行日志记录。 在给定文件的描述中提到,教程包含了编译好的spdlog库,这意味着读者不需要从源代码手动编译spdlog库,可以直接在项目中使用。同时,教程适用于使用msvc2017-64编译器的开发者,确保了环境的一致性,便于理解和实践。 本教程的主要内容涵盖了以下几个方面: 1. **Qt环境配置**: - Qt是一个跨平台的C++应用程序框架,广泛用于开发图形用户界面(GUI)程序。本教程需要的Qt环境配置包括安装Qt开发工具、Qt Creator IDE以及相应的编译器msvc2017-64。 2. **spdlog库的介绍与集成**: - spdlog库的介绍:spdlog是一个广泛使用的日志库,以其简洁的API和高性能著称。它支持异步记录、多种日志级别、自定义格式化等功能,是现代C++项目中常用的日志记录工具。 - 集成spdlog到Qt项目:需要将spdlog库的头文件引入到Qt的项目文件.pro中,并确保编译器能够找到spdlog库文件。这通常涉及到设置头文件路径和库文件路径。 3. **编写示例代码**: - 示例代码会涉及到spdlog的使用,比如创建日志记录器、设置日志级别、记录不同类型的日志信息、异步日志记录等。 - 示例代码会展示如何将spdlog集成到Qt的Widget类中,以及如何在Qt的主线程和子线程中记录日志。 4. **构建与测试**: - 介绍如何使用Qt Creator编译和运行示例程序。 - 演示如何观察和分析输出的日志信息,以及如何根据实际需求调整日志配置。 5. **常见问题解决**: - 在集成和使用spdlog时,可能会遇到的问题及其解决方案。 - 如何在Qt和spdlog之间处理跨线程的日志记录问题。 给定的压缩包子文件名称列表中包含了五个文件: - main.cpp:这是程序的入口文件,其中应该包含了创建应用程序实例、设置主窗口以及启动事件循环的代码。 - widget.cpp:这个文件可能包含了Qt窗口部件Widget的具体实现代码,涉及用户界面和逻辑部分。 - spdlogDemo.pro:这是一个Qt项目文件,用于指定项目设置,如编译选项、包含的文件、依赖库等。在该文件中会指定spdlog库的路径,以便编译器能够链接到spdlog库。 - widget.ui:这是使用Qt Designer创建的用户界面文件,通过Qt Creator的.ui文件生成功能,可以在widget.cpp中使用。 - spdlog:这个文件夹包含了编译好的spdlog库文件,以及可能的头文件和库文件。 通过以上文件和步骤,初学者可以逐步建立一个完整的Qt项目,实现使用spdlog进行日志记录的功能,从而加深对C++日志库和Qt框架的理解与应用。

#ifndef MYSPDLOG_H #define MYSPDLOG_H #include <fstream> #include <iostream> #define SPDLOG_HEADER_ONLY #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_DEBUG #include "spdlog/spdlog.h" #include "spdlog/logger.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/daily_file_sink.h" class MySpdlog { public: static MySpdlog*getInstace() { static MySpdlog MySpdlogStatic; return &MySpdlogStatic; } int init() { std::string formatStr="%Y-%m-%dT%H:%M:%S.%e[%l][%s:%#][%!]%v"; // auto myLogger1 = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); // auto myLogger1 = std::make_shared<spdlog::sinks::daily_file_sink>("spdlog", "logs/log.txt", 0, 0); auto myLogger1 = spdlog::daily_logger_mt("spdlog", "logs/log.txt", 0, 0); // myLogger1 = spdlog::rotating_logger_mt("spdlog", "logs/myspdlog.log", 1024 * 1024 * 10, 10); spdlog::set_default_logger(myLogger1); myLogger1->set_level(spdlog::level::debug); myLogger1->set_pattern(formatStr); myLogger2 = spdlog::stdout_color_mt("baseLogger2"); spdlog::set_default_logger(myLogger2); myLogger2->set_level(spdlog::level::debug); myLogger2->set_pattern(formatStr); return 0; } void uninit() { } std::shared_ptr<spdlog::logger> myLogger1; std::shared_ptr<spdlog::logger> myLogger2; private: MySpdlog() {} ~MySpdlog() {} }; #define SPLOG_INIT() MySpdlog::getInstace()->init() #define SPLOG_UNINIT() MySpdlog::getInstace()->uninit() #define SPLOG_DEBUG(...) do {SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_DEBUG(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_INFO(...) do {SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_INFO(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPLOG_ERROR(...) do {SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger1, __VA_ARGS__);\ SPDLOG_LOGGER_ERROR(MySpdlog::getInstace()->myLogger2, __VA_ARGS__);}while(0) #define SPDLOG_CLRAR(a) do{std::fstream fout((a),std::ios::out|std::ios::trunc);fout.close();}while(0); #endif // MYSPDLOG_H运行之后调用SPLOG_INFO时报错

2023-06-13 上传