Loading... # 高性能的日志模块**spdlog** > 关于异步写日志模块的选择: # 一、日志模块 1. **easylogging++**:轻量级,易用,支持异步日志,适合中小型项目,配置简单,功能较全面。 2. **spdlog**:性能优异,支持异步日志,线程安全,广泛使用,支持多种日志格式和目标,社区活跃,适合对性能有较高要求的项目。 3. **muduo async log**:muduo库自带的异步日志模块,设计用于高性能网络库,适合网络服务器等高并发场景,但依赖muduo库,集成成本较高。 建议:如果你项目对性能和灵活性要求较高,推荐使用**spdlog**;如果项目较简单或想快速集成,**easylogging++是不错的选择;如果你已经使用muduo库,或者项目是高性能网络服务,使用muduo async log**更合适。 # 二、**spdlog的使用** ## 1、Demo ```jsx #include <spdlog/spdlog.h> #include <spdlog/sinks/basic_file_sink.h> #include <spdlog/async.h> #include <spdlog/fmt/bin_to_hex.h> #include <thread> #include <chrono> #include <iostream> #include <iomanip> int main() { auto async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "async_log.txt"); spdlog::set_default_logger(async_logger); // 设置日志格式,添加时间戳 spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v"); std::cout << "主线程开始日志写入" << std::endl; spdlog::info("异步日志示例开始"); std::thread t1([]() { for (int i = 0; i < 10; ++i) { spdlog::info("线程1日志条目 {}", i); { auto now = std::chrono::system_clock::now(); std::time_t now_c = std::chrono::system_clock::to_time_t(now); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000; char time_buf[30]; std::strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now_c)); std::cout << "[" << time_buf << "." << std::setfill('0') << std::setw(3) << ms.count() << "] 线程1写入日志: " << i << std::endl; } std::this_thread::sleep_for(std::chrono::milliseconds(50)); } }); std::thread t2([]() { for (int i = 0; i < 10; ++i) { spdlog::info("线程2日志条目 {}", i); { auto now = std::chrono::system_clock::now(); std::time_t now_c = std::chrono::system_clock::to_time_t(now); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000; char time_buf[30]; std::strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now_c)); std::cout << "[" << time_buf << "." << std::setfill('0') << std::setw(3) << ms.count() << "] 线程2写入日志: " << i << std::endl; } std::this_thread::sleep_for(std::chrono::milliseconds(30)); } }); t1.join(); t2.join(); spdlog::info("异步日志示例结束"); std::cout << "主线程日志写入结束" << std::endl; spdlog::shutdown(); return 0; } ``` 安装:sudo apt-get install libspdlog-dev 运行:root@iZbp1est4y0mdt6ask7pgpZ:/home/peter/spdlog# g++ -std=c++11 -pthread -o spdlogtest spdlogtest.cpp 终端打印: ```jsx root@iZbp1est4y0mdt6ask7pgpZ:/home/peter/spdlog# ./spdlogtest 主线程开始日志写入 [2025-07-14 20:37:07.142] 线程2写入日志: 0 [2025-07-14 20:37:07.142] 线程1写入日志: 0 [2025-07-14 20:37:07.173] 线程2写入日志: 1 [2025-07-14 20:37:07.193] 线程1写入日志: 1 [2025-07-14 20:37:07.203] 线程2写入日志: 2 [2025-07-14 20:37:07.233] 线程2写入日志: 3 [2025-07-14 20:37:07.243] 线程1写入日志: 2 [2025-07-14 20:37:07.263] 线程2写入日志: 4 [2025-07-14 20:37:07.293] 线程1写入日志: 3 [2025-07-14 20:37:07.293] 线程2写入日志: 5 [2025-07-14 20:37:07.324] 线程2写入日志: 6 [2025-07-14 20:37:07.343] 线程1写入日志: 4 [2025-07-14 20:37:07.354] 线程2写入日志: 7 [2025-07-14 20:37:07.384] 线程2写入日志: 8 [2025-07-14 20:37:07.393] 线程1写入日志: 5 [2025-07-14 20:37:07.414] 线程2写入日志: 9 [2025-07-14 20:37:07.444] 线程1写入日志: 6 [2025-07-14 20:37:07.494] 线程1写入日志: 7 [2025-07-14 20:37:07.544] 线程1写入日志: 8 [2025-07-14 20:37:07.594] 线程1写入日志: 9 主线程日志写入结束 ``` 日志文件打印:  最后修改:2025 年 07 月 14 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏