C++高并发日志系统实战开发

发布时间:2026/10/30 15:56:24

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

更多相关文章

2026/10/25 5:59:25

Unity URP高亮效果实战:Highlight Plus V21配置与性能优化指南

1. 项目概述:为什么我们需要Highlight Plus V21? 在Unity URP管线里做高亮效果,如果你还在用自己写Shader或者依赖后处理全屏扫描的方式,那真的有点“石器时代”了。我接手过不少项目,早期为了一个物体描边、高亮&…

2026/10/25 14:50:26

MA12070与PIC18F57Q43构建高效D类音频系统

1. 项目概述与核心器件选型在DIY音频系统领域,MA12070PIC18F57Q43的组合堪称黄金搭档。MA12070是英飞凌推出的超高效D类音频功放芯片,采用专利的多级开关技术,实测效率可达92%以上。而PIC18F57Q43作为Microchip旗下中端8位MCU,具备…

2026/10/30 5:27:33

影刀RPA GIS地图数据处理:GeoJSON转换与坐标采集

影刀RPA GIS地图数据处理:GeoJSON转换与坐标采集 作者:林焱 | 分类:影刀RPA新手教程 | 难度:★★★ 什么情况用 物流规划、门店选址、外卖配送范围划定等场景,需要批量处理地理数据。比如:从高德地图搜索&…

2026/10/30 15:54:46

数据库表结构设计核心原理与实战避坑指南

简介:本资源是《数据库系统概念(第七版)》核心实践配套材料,面向高校计算机专业学生、数据库初学者及备考人员,聚焦表结构设计原理与课后习题实战训练,有效解决理论理解难、SQL动手弱、答案验证缺等学习痛点…

2026/10/30 15:54:46

人工智能数学基础:习题答案与NumPy代码验证实战

简介:这份面向人工智能学习者与转岗从业者的数学基础资料包,围绕唐宇迪相关课程内容整理,重点解决线性代数、概率论与统计、微积分、最优化理论等知识“看得懂却不会用”的问题,并借助习题答案与配套源代码把公式推导落到编程实践…

2026/10/30 15:54:46

SSM电影推荐系统源码解析:架构、UserCF协同过滤与部署指南

简介:这是一份基于Java SSM框架的电影推荐系统完整源码包,面向高校计算机专业学生及初入行的Java开发者,可用于毕业设计、课程设计或SSM整合实战练习。系统覆盖用户管理、图片与视频素材维护、推荐展示等核心模块,并配有MySQL 5.7…

2026/10/30 15:54:46

AI炒股系统设计:多Agent架构与LGBM择时模型实战

简介:这是一套面向量化入门者与Python爱好者的轻量级AI炒股系统源码,聚焦股票择时分析与周度复盘实战,解决初学者难以构建端到端交易逻辑的痛点。资源共11个文件,含4个核心Python脚本(如app.py、main.py、train.py&…

2026/10/30 15:54:46

MCP服务端实战:向量化工具注册与调用优化

简介:这份资源是面向 AI 开发者与研究人员的 Vectorize MCPDeep 服务配套工程包,聚焦于借助 MCP 服务器快速搭建人工智能研究与开发环境,适合已具备 Node.js 与 TypeScript 基础、希望接入 Vectorize 平台进行实验的中高级开发者。压缩包共 1…

2026/10/30 15:49:44

1U=4.45cm:服务器选型先被机柜与物理尺寸约束

简介:《服务器硬件全解》是一份面向IT运维、售前选型及计算机相关专业学习者的PPT文档,系统梳理服务器硬件基础知识与选型思路,适合入门打底和日常查阅。压缩包共1个PPT文件,约6.65MB,页面以分类条目和配置参数为主&am…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑