当前位置: 首页 > news >正文

ZLToolKit 源码分析(九):Logger 日志系统与 NoticeCenter 消息广播

Logger 和 NoticeCenter 是 ZLToolKit 的两个关键工具组件:一个解决"看得见"(日志),一个解决"解得了耦"(消息广播)。本文深入分析两者的实现,揭示 C++ 观察者模式的优雅实践。

1. Logger 日志系统

1.1 架构总览

LogContextCapture (流式日志 << 运算符) → LogContext (上下文:文件/行/级别/时间) → Logger (单例分发器) → LogChannel (通道基类) ├─ ConsoleChannel (控制台输出) ├─ FileChannel (文件输出) └─ SysLogChannel (syslog 输出) → LogWriter (写入器) ├─ AsyncLogWriter (异步写入) └─ SyncLogWriter (同步写入)

1.2 日志级别

typedefenum{LTrace=0,LDebug,LInfo,LWarn,LError}LogLevel;

1.3 流式日志宏

// 用法DebugL<<"connect to "<<ip<<":"<<port;InfoL<<"stream started";WarnL<<"timeout, retrying";ErrorL<<"socket error: "<<strerror(errno);

宏定义:

#defineDebugLLogContextCapture(Logger::Instance(),\LogContext(LDebug,__FILE__,__FUNCTION__,__LINE__))#defineInfoLLogContextCapture(Logger::Instance(),\LogContext(LInfo,__FILE__,__FUNCTION__,__LINE__))#defineWarnLLogContextCapture(Logger::Instance(),\LogContext(LWarn,__FILE__,__FUNCTION__,__LINE__))#defineErrorLLogContextCapture(Logger::Instance(),\LogContext(LError,__FILE__,__FUNCTION__,__LINE__))#defineTraceLLogContextCapture(Logger::Instance(),\LogContext(LTrace,__FILE__,__FUNCTION__,__LINE__))

1.4 LogContextCapture — 流式捕获

classLogContextCapture{public:LogContextCapture(Logger&logger,LogContext&&ctx):_logger(logger),_ctx(std::move(ctx)){}~LogContextCapture(){// 析构时将累积的内容写入日志_ctx._content=_oss.str();_logger.add(_ctx);}// << 运算符重载template<typenameT>LogContextCapture&operator<<(constT&data){_oss<<data;return*this;}private:Logger&_logger;LogContext _ctx;stringstream _oss;};

精妙之处:利用临时对象的析构时机——DebugL << "xxx"产生临时LogContextCapture,语句结束时析构自动 flush。

1.5 LogContext — 日志上下文

structLogContext{LogLevel _level;string _file;string _function;int_line;string _content;uint64_t_time;LogContext(LogLevel level,constchar*file,constchar*function,intline):_level(level),_file(file),_function(function),_line(line
http://www.jsqmd.com/news/976636/

相关文章:

  • 5步永久激活IDM:免费解锁下载加速神器的完整教程
  • 技术团队管理:从监督到成就,一线班组长的角色转型与协调之道
  • 2026北京本地劳力士回收推荐:各大平台综合实力实测结果新鲜 - 奢侈品回收测评
  • 基于NXP EdgeLock SE05x与Hyperledger Sawtooth的物联网设备硬件安全身份认证实践
  • 滁州CMA甲醛检测治理公司深度测评:正信CMA检测本地优选 - aZJ-111
  • 如何永久保存微信聊天记录:WeChatMsg三步实现数据自主管理
  • 单相电机绕组设计与性能仿真工具(南牛本地版,含YC/YY模板和磁材曲线)
  • 从原始数据到方位角:QMC5883磁力计数据采集与简易校准算法实现
  • TestDisk与PhotoRec:免费开源的数据恢复终极指南
  • 保姆级教程:在Docker里复现SEED-Lab SQL注入靶场,手把手带你绕过登录与篡改数据
  • 别再乱导Gerber了!用Altium Designer(AD)导出PCB生产文件的保姆级避坑指南
  • 从‘仓库终端’到‘采购报表’:拆解一个经典数据流图,掌握系统分析的底层思维
  • ZLToolKit 源码分析(十):工具集 ResourcePool / RingBuffer / miniINI / TimeTicker
  • Docker化部署NFS服务器:一条命令替代Ubuntu原生安装,快速搭建测试环境
  • 网盘效率革命:八大平台直链解析工具的终极指南
  • 浙江EVA工具包生产厂家好评榜:2026年升级 - 品牌推广大师
  • 从‘匹配失败’到‘精准捕获’:re.findall()匹配空列表的5个排查技巧与进阶用法
  • 滁州CMA甲醛检测治理公司深度测评:正信CMA检测稳居榜首 - aZJ-111
  • 私有化视频会议系统/企业级融媒体平台EasyDSS全场景一体化协同赋能企业高效数字化办公
  • 终极指南:3分钟在Mac上制作Windows启动盘(WinDiskWriter完全攻略)
  • PHP分布式锁与应用场景
  • 任天堂Switch大气层系统终极指南:5个步骤快速上手自定义固件
  • FPGA入门避坑指南:从选型到烧录,我的第一个‘点灯’项目踩了哪些雷?
  • MCU深度学习:从GPIO到通信协议,系统化掌握单片机核心原理与项目实战
  • 2023电赛E题STM32F1嵌入式工程:CAN通信+伺服控制+完整驱动与算法实现
  • 2026石家庄名表回收指南:行情、避坑与四家机构实测 - 奢侈品回收测评
  • 别再死记硬背了!用这5个真实项目案例,帮你彻底搞懂软件工程导论的核心概念
  • 智能会议管理系统/视频直播点播EasyDSS打造一体化应急调度解决方案
  • HC08微控制器SCI串口通信:输入时钟与波特率配置详解
  • Blender超级导入导出插件:用复制粘贴彻底改变你的3D工作流 [特殊字符]