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包含所有线程输出的分级日志日志有序无乱序、无丢失。

相关新闻

最新新闻

暗黑破坏神3智能按键解决方案:5分钟实现职业Build自动化管理

暗黑破坏神3智能按键解决方案:5分钟实现职业Build自动化管理

暗黑破坏神3智能按键解决方案:5分钟实现职业Build自动化管理 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 在《暗黑破坏神3》的高强度刷…

2026/7/10 11:39:21
破茧成蝶的前奏:深入浅出编译器的骨架——抽象语法树(AST)

破茧成蝶的前奏:深入浅出编译器的骨架——抽象语法树(AST)

破茧成蝶的前奏:深入浅出编译器的骨架——抽象语法树(AST) 在全线洗劫了 MLIR 框架、底层方言以及各种硬核的 Pass 优化之后,我们需要将目光暂时从编译器的“中后端”移回一切故事开始的地方——前端(Frontend&#x…

2026/7/10 11:39:21
MA12070与STM32F107VC构建高效音频系统方案

MA12070与STM32F107VC构建高效音频系统方案

1. 为什么选择MA12070与STM32F107VC搭建音频系统 在音频设备开发领域,D类放大器与微控制器的组合方案一直备受关注。MA12070作为一款采用多级切换技术的D类音频放大器,具有几个显著优势:首先是其宽电压工作范围(4-26V)…

2026/7/10 11:39:21
ADS131M02与PIC18F56K42的高精度数据采集方案

ADS131M02与PIC18F56K42的高精度数据采集方案

1. 为什么选择ADS131M02与PIC18F56K42这对黄金组合 在工业测量和医疗设备领域,ADC(模数转换器)的性能往往直接决定整个系统的精度上限。我最近为一个肌电信号采集项目选型时,对比了市面上十余款ADC芯片,最终锁定TI的AD…

2026/7/10 11:39:21
磁力链接转种子文件实战指南:Magnet2Torrent让资源下载更稳定

磁力链接转种子文件实战指南:Magnet2Torrent让资源下载更稳定

磁力链接转种子文件实战指南:Magnet2Torrent让资源下载更稳定 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent 你是否经常遇到磁力链接下载不稳定、无法…

2026/7/10 11:39:21
监管新规重塑赛道:2026年儿童AI陪伴机器人品牌与场景化选购分析

监管新规重塑赛道:2026年儿童AI陪伴机器人品牌与场景化选购分析

2026年,儿童AI陪伴机器人市场在高速增长中迎来关键转折。2025年全球儿童陪伴机器人市场估值约109.1亿美元,预计2026年将达到121.8亿美元。中国AI玩具市场2025年规模已达290亿元,预计2030年突破千亿元。市场高速扩张的同时,监管框架…

2026/7/10 11:34:21

月新闻