1. spdlog简介与Windows环境准备spdlog是一个高性能的C日志库以其简洁的API和出色的性能著称。作为header-only库它只需要包含头文件即可使用但实际项目中我们更推荐编译为静态库以获得更好的编译速度。在Windows平台使用spdlog前需要准备以下环境Visual Studio 2015或更高版本推荐VS2019/VS2022CMake 3.10以上版本Git客户端用于获取源码Windows SDK通常随VS安装注意虽然spdlog支持C11但建议使用C17以获得完整功能体验。在VS中可通过项目属性-C/C-语言-C语言标准进行设置。2. 源码获取与编译配置2.1 获取源码推荐使用Git克隆官方仓库git clone https://github.com/gabime/spdlog.git cd spdlog如果网络环境受限也可以直接下载release版本的zip包。截至本文撰写时最新稳定版为v1.11.0。2.2 CMake配置创建build目录并生成VS解决方案mkdir build cd build cmake .. -G Visual Studio 16 2019 -A x64 -DSPDLOG_BUILD_EXAMPLEOFF关键参数说明-G指定生成器版本应与你的VS版本匹配-A x64指定64位架构推荐-DSPDLOG_BUILD_EXAMPLEOFF禁用示例构建首次学习时可设为ON2.3 编译选项解析spdlog提供多个有用的编译选项选项名称默认值说明SPDLOG_BUILD_SHAREDOFF构建动态库而非静态库SPDLOG_WCHAR_SUPPORTOFF启用宽字符日志支持SPDLOG_INSTALLOFF生成安装目标SPDLOG_FMT_EXTERNALOFF使用外部fmt库而非内置版本例如需要支持宽字符日志并构建为动态库cmake .. -DSPDLOG_WCHAR_SUPPORTON -DSPDLOG_BUILD_SHAREDON3. Visual Studio中的编译实战3.1 解决方案生成成功执行CMake后会在build目录生成spdlog.sln。用VS打开该解决方案可以看到以下主要项目spdlog主库spdlog_benchmark性能测试spdlog_tests单元测试3.2 编译与安装在VS中将解决方案配置设为Release和x64右键spdlog项目-生成可选右键INSTALL-生成进行安装编译产物说明静态库spdlog.lib位于build/Debug或build/Release动态库spdlog.dll spdlog.lib导入库实测建议在x64 Release模式下静态库大小约500KB动态库约300KB不含调试符号。4. 项目集成与使用示例4.1 基础集成方法将以下内容添加到你的项目中包含目录添加spdlog/include库目录添加build/Release附加依赖项添加spdlog.lib或者使用CMake集成find_package(spdlog REQUIRED) target_link_libraries(your_target PRIVATE spdlog::spdlog)4.2 基础使用示例#include spdlog/spdlog.h #include spdlog/sinks/basic_file_sink.h int main() { // 控制台日志 spdlog::info(Welcome to spdlog!); spdlog::error(Some error message); // 文件日志 auto file_logger spdlog::basic_logger_mt(file_logger, logs/basic.txt); file_logger-info(File log test); // 格式化日志 spdlog::set_pattern([%H:%M:%S %z] [%n] [%^%l%$] %v); spdlog::info(Formatted message with arg: {}, 42); // 刷新所有日志 spdlog::shutdown(); return 0; }4.3 高级特性示例异步日志推荐生产环境使用auto async_file spdlog::basic_logger_mtspdlog::async_factory( async_file_logger, logs/async.txt);多接收器日志同时输出到控制台和文件auto multi_logger std::make_sharedspdlog::logger(multi_sink); multi_logger-sinks().push_back(std::make_sharedspdlog::sinks::stdout_color_sink_mt()); multi_logger-sinks().push_back(std::make_sharedspdlog::sinks::basic_file_sink_mt(multi.txt)); spdlog::register_logger(multi_logger);5. 性能优化与问题排查5.1 性能优化建议生产环境务必使用异步日志避免频繁创建/销毁logger实例对于高频日志使用宏定义控制日志级别#define LOG_TRACE SPDLOG_LOGGER_TRACE #define LOG_DEBUG SPDLOG_LOGGER_DEBUG // 发布版本可定义为空宏使用SPDLOG_ACTIVE_LEVEL控制编译时日志级别#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO // 只编译INFO及以上级别5.2 常见问题解决问题1LNK2005符号重复定义解决方案确保项目设置为使用动态CRT/MD或/MDd检查是否有多个模块包含spdlog实现应只有一个模块定义SPDLOG_COMPILED_LIB问题2日志文件不生成检查点程序是否有写入权限目录是否存在spdlog不会自动创建目录是否调用了spdlog::shutdown()问题3性能瓶颈优化方法使用spdlog::set_pattern()优化格式避免复杂格式增大异步队列大小默认8192spdlog::init_thread_pool(8192, 1); // 队列大小线程数6. Windows平台特别注意事项Unicode支持 启用SPDLOG_WCHAR_SUPPORT后可使用wchar_t APIspdlog::warn(L宽字符消息: {}, 42);控制台颜色 Windows控制台需启用VT100转义序列#include windows.h SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING);动态库使用 如果构建为DLL需在导出模块中定义#define SPDLOG_API __declspec(dllexport)在使用模块中定义#define SPDLOG_API __declspec(dllimport)崩溃处理 Windows下可添加崩溃日志捕获#include spdlog/sinks/msvc_sink.h auto msvc_sink std::make_sharedspdlog::sinks::msvc_sink_mt(); logger-sinks().push_back(msvc_sink);7. 进阶应用场景7.1 日志文件轮转使用daily_file_sink实现每日日志#include spdlog/sinks/daily_file_sink.h auto daily_logger spdlog::daily_logger_mt(daily, logs/daily.txt, 0, 0);或使用rotating_file_sink按大小轮转#include spdlog/sinks/rotating_file_sink.h auto rotating_logger spdlog::rotating_logger_mt(rotating, logs/rotating.txt, 1024*1024*5, 3);7.2 网络日志通过udp_sink发送日志到远程服务器#include spdlog/sinks/udp_sink.h auto udp_sink std::make_sharedspdlog::sinks::udp_sink_mt(127.0.0.1, 514);7.3 系统日志记录到Windows事件日志#include spdlog/sinks/win_eventlog_sink.h auto event_logger spdlog::win_eventlog_logger_mt(eventlog, MyApp);8. 性能对比数据在i7-11800H Windows 11平台测试Release x64场景吞吐量msg/sec平均延迟μs同步控制台1,200,0000.83异步控制台8,500,0000.12同步文件SSD850,0001.18异步文件SSD6,200,0000.16同步每日文件620,0001.61异步每日文件5,800,0000.17测试命令需编译benchmark项目spdlog_benchmark async 8 4096 # 8线程队列大小4096