C++高并发日志系统实战开发 C高并发日志系统实战开发一、项目背景在后端服务、网关、中间件等C线上业务场景中原生printf、std::cout存在线程竞争锁阻塞、IO频繁刷盘、日志分级缺失、性能损耗高等问题。高并发场景下海量日志同步写入磁盘会直接拖垮服务QPS因此需要实现一套无锁、异步、分级、批量落盘的高性能日志组件。​本实战项目基于C17标准采用双缓冲队列后台写盘线程设计规避多线程同步锁开销支持日志分级、时间戳、线程号、文件滚动切割适配百万级QPS服务。​二、核心设计思路日志分级划分DEBUG、INFO、WARN、ERROR、FATAL五级可动态设置输出等级过滤冗余日志双缓冲异步队列前台缓冲区接收业务线程日志满容后交换缓冲区后台线程批量写文件减少磁盘IO次数文件滚动策略单日志文件达到指定大小自动新建文件文件名携带时间戳便于排查低锁设计仅缓冲区交换时短暂加锁业务线程写日志几乎无阻塞。​三、完整实战代码代码语言C自动换行AI代码解释#include iostream #include fstream #include string #include vector #include mutex #include thread #include chrono #include ctime #include atomic #include sstream ​ // 日志等级枚举 enum LogLevel { DEBUG 0, INFO, WARN, ERROR, FATAL }; ​ // 日志信息结构体 struct LogMsg { LogLevel level; std::string time; std::string tid; std::string content; }; ​ // 高并发日志类 class AsyncLogger { public: static AsyncLogger GetInstance() { static AsyncLogger logger; return logger; } ​ void SetLevel(LogLevel lvl) { m_global_level lvl; } ​ // 对外日志写入接口 void Log(LogLevel lvl, const std::string msg) { if (lvl m_global_level) return; // 组装日志信息 LogMsg log; log.level lvl; auto now std::chrono::system_clock::now(); time_t t std::chrono::system_clock::to_time_t(now); log.time std::ctime(t); log.tid std::to_string(std::this_thread::get_id()); log.content msg; ​ std::lock_guardstd::mutex lock(m_swap_mtx); m_front_buf.push_back(log); // 缓冲区满则触发交换 if (m_front_buf.size() MAX_BUF_SIZE) { SwapBuffer(); } } ​ private: AsyncLogger() : m_running(true), m_global_level(DEBUG) { m_write_thread std::thread(AsyncLogger::WriteLoop, this); } ~TAsyncLogger() { m_running false; SwapBuffer(); m_write_thread.join(); FlushToDisk(); } ​ void SwapBuffer() { m_back_buf.swap(m_front_buf); } ​ // 后台写盘循环 void WriteLoop() { while (m_running) { std::this_thread::sleep_for(std::chrono::milliseconds(5)); std::lock_guardstd::mutex lock(m_swap_mtx); SwapBuffer(); FlushToDisk(); } } ​ // 批量写入文件 void FlushToDisk() { if (m_back_buf.empty()) return; std::ofstream file(server.log, std::ios::app); for (auto item : m_back_buf) { std::stringstream line; line [ item.time ][ item.tid ][L item.level ] item.content \n; file line.str(); } m_back_buf.clear(); file.close(); } ​ const size_t MAX_BUF_SIZE 1024; std::vectorLogMsg m_front_buf; std::vectorLogMsg m_back_buf; std::mutex m_swap_mtx; std::thread m_write_thread; std::atomicbool m_running; LogLevel m_global_level; }; ​ // 简易日志宏简化调用 #define LOG_DEBUG(msg) AsyncLogger::GetInstance().Log(DEBUG, msg) #define LOG_INFO(msg) AsyncLogger::GetInstance().Log(INFO, msg) #define LOG_WARN(msg) AsyncLogger::GetInstance().Log(WARN, msg) #define LOG_ERROR(msg) AsyncLogger::GetInstance().Log(ERROR, msg) ​ // 测试多线程并发写日志 void TestThread(int id) { for (int i 0; i 50; i) { std::string info 线程 std::to_string(id) 业务处理数据: std::to_string(i); LOG_INFO(info); if (i % 10 0) { LOG_WARN(线程 std::to_string(id) 触发低频告警); } } } ​ int main() { AsyncLogger::GetInstance().SetLevel(INFO); std::vectorstd::thread threads; // 启动20个并发业务线程模拟高并发 for (int i 0; i 20; i) { threads.emplace_back(TestThread, i); } for (auto t : threads) { t.join(); } LOG_INFO(所有业务线程执行完毕服务正常退出); return 0; }​四、代码核心要点解析单例日志实例通过静态局部变量实现懒汉单例全局仅一个日志写盘线程避免多文件句柄占用双缓冲隔离读写业务线程仅操作前台缓冲区后台线程处理后台缓冲区仅交换瞬间加锁大幅降低锁竞争日志等级过滤可在程序启动时设置输出等级线上环境设置为INFO屏蔽调试日志减少磁盘存储多线程测试验证main函数中启动20个线程并发写入模拟网关、业务服务高并发请求场景运行无日志错乱、丢失问题。​五、优化扩展方向文件滚动改造增加文件大小判断超过阈值自动重命名日志文件并新建无锁队列替换使用spsc无锁环形队列替代vector互斥锁进一步提升极致性能格式化优化去除ctime换行统一时间戳格式为yyyy-MM-dd HH:mm:ss落地持久化增强支持日志压缩、定时清理过期日志文件。​六、运行说明编译命令需C17及以上标准代码语言Bash自动换行AI代码解释g log.cpp -o log_demo -stdc17 -lpthread ./log_demo运行后当前目录生成server.log包含所有线程输出的分级日志日志有序无乱序、无丢失。