发布时间:2026/8/30 3:12:05
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/8/24 20:35:32

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

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

2026/8/27 8:35:37

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

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

2026/8/28 10:31:30

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

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

2026/8/30 3:09:08

Android校招核心考点全解析:从Handler到Binder的进阶之路

1. 一场校招笔试背后的Android技术全景1.1 为什么“第三场”值得认真对待爱奇艺2018秋季校招Android工程师(第三场),这个标题对很多当年投过简历的同学来说,可能只是一封普通的笔试通知。但如果把“第三场”这三个字单独拎出来看&…

2026/8/30 3:09:08

0基础玩转顺序表:核心概念 + 增删查改功能

玩转顺序表:理解核心概念 实现增删查改功能 阅读本文需要C语言基础,掌握指针、结构体、动态内存分配与断言。 顺序表概念讲解 线性表 线性表的定义 线性表是最基本、最简单、也是最常用的一种数据结构。线性表*(linear list)*是…

2026/8/30 3:09:08

大模型越狱攻防:从安全测试到本地部署加固实践

这次我们来看一个最近在大模型圈子里绕不开的话题:大模型越狱。注意,这里说的不是 iOS 那个越狱,而是大模型安全测试里常说的 Jailbreak。简单讲,就是通过构造特定输入提示词,尝试绕过模型自身的安全对齐策略&#xff…

2026/8/30 3:09:08

水母堵塞核电站冷源:从滤网差压到反应堆强制停堆的完整链路

在沿海核电站的运行记录中,因为设备故障、电网波动或极端天气导致反应堆停运并不罕见,但“水母导致三座反应堆强制关闭”这种事件,第一次看到时很容易被当作一则猎奇新闻。实际上,它揭示的是核电和大型滨海工业设施中一个非常现实…

2026/8/30 3:09:08

自然语言界面只保留了表单五件事中的一件,工程真相是什么?

“Forms did five things. Natural language kept one”这句话,我第一次看到时觉得有点绕,但结合最近在做的对话式表单、AI Agent 录入类项目再看,突然就通了。传统表单页面里,一个录入表单通常要承担“字段定义、用户引导、取值约…

2026/8/30 3:04:08

ST推Web智能传感器开发工具,浏览器中搞定MLC/FSM配置

web工具这种东西,放在几年前,嵌入式工程师大概率是看不上的。寄存器配置、传感器驱动、算法部署,哪个不是靠在IDE里反复编译调试、对着数据手册翻到页面发黄才搞定的?但这两年情况确实变了,AIoT项目的迭代速度越来越快…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…