C++实现基于装饰器模式的异步日志中间件功能增强扩展方案 _ 实战【实战】

云杰大大_3392

云杰大大_3392

2026-05-10

770人浏览

原创

可采用装饰器模式对异步日志系统进行非侵入式功能增强,包括日志采样、上下文注入、格式加密、性能计时和多级条件路由五种扩展方案。

c++实现基于装饰器模式的异步日志中间件功能增强扩展方案 _ 实战【实战】

如果您希望在C++项目中为异步日志系统动态叠加功能(如日志采样、上下文注入、格式加密、性能计时等),而不修改原有日志器核心逻辑,则可采用装饰器模式对日志中间件进行非侵入式增强。以下是实现该功能增强的多种扩展方案:

一、日志采样装饰器

该装饰器通过概率或阈值控制实际写入日志的请求比例,降低高吞吐场景下的I/O压力,同时保持日志语义完整性。其本质是在调用下游日志器前插入采样判定逻辑。

1、定义抽象日志器接口 std::shared_ptr,包含 log(const LogEntry&) 方法;

2、声明 SamplingDecorator 类,继承自 Logger,持有一个 std::shared_ptr 成员变量 target_;

3、在 SamplingDecorator::log() 中,生成 [0.0, 1.0) 区间随机浮点数,若小于预设采样率 sample_rate_,则调用 target_->log(entry);

4、将原始 AsyncFileLogger 实例传入 SamplingDecorator 构造函数,构建链式调用节点。

二、上下文注入装饰器

该装饰器自动将当前线程ID、协程ID、请求TraceID、用户身份标识等运行时上下文字段注入到 LogEntry 的 metadata 字段中,避免业务代码重复填充。

1、定义 ContextInjectorDecorator 类,继承 Logger,持有 std::function<:map std::string>()> context_provider_;

2、重写 log() 方法:先调用 context_provider_() 获取上下文映射,再遍历插入 entry.metadata;

3、使用 thread_local static std::string current_trace_id 存储跨异步阶段传递的追踪ID;

4、构造时传入 Lambda 表达式捕获当前 TLS 变量与协程调度器状态,确保每次日志调用获取最新上下文。

三、日志加密装饰器

该装饰器对 LogEntry 中的 message 字段或敏感字段(如 user_email、token)执行AES-128-GCM加密,满足合规性要求,且不改变日志流转路径。

1、引入 OpenSSL 或 libsodium 库,封装 Encryptor 类提供 encrypt(const std::string&) -> std::string 接口;

4、在 EncryptedDecorator::log() 中,深拷贝 entry,调用 encryptor_->encrypt(entry.message) 替换原文本;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

3、若 entry.metadata 存在标记键 "sensitive_fields",则对其指定键列表执行逐字段加密;

5、加密密钥通过环境变量读取并经 KMS密钥解封后加载至内存,生命周期与装饰器实例一致。

四、执行耗时计时装饰器

该装饰器自动记录每条日志从 log() 调用到被异步写入器真正消费之间的时间延迟,用于监控日志系统背压状况。

1、定义 TimingDecorator 类,内部维护 std::shared_ptr latency_histogram_;

2、log() 方法起始处调用 auto start = std::chrono::steady_clock::now();

3、调用 target_->log(entry) 后立即获取 end 时间戳,计算 duration_cast<:chrono::microseconds>(end - start).count();

4、将延迟微秒值提交至 latency_histogram_ 进行分桶统计;

5、该装饰器必须置于装饰链末端附近,以确保测量覆盖完整异步排队+序列化+IO等待过程。

五、多级条件路由装饰器

该装饰器依据日志等级、模块名、关键词匹配等复合条件,将日志条目分发至不同下游目标(如 ERROR 到 Sentry、DEBUG 到本地文件、含 "payment" 的到 Kafka Topic)。

1、定义 RoutingDecorator 类,持有一个 std::vector<:pair logentry>, std::shared_ptr>> rules_;

2、每个规则由谓词函数和对应日志器组成,谓词返回 true 即触发转发;

3、log() 方法中遍历 rules_,对每个谓词执行 entry 匹配,匹配成功即异步投递副本(非移动),允许多路并行输出;

4、预置默认规则兜底,确保未匹配日志仍流向原始 target_。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习