首页 » 网站建设 » php拼接宏界说技巧_设计筹划和范例 宏拼接办法实现log函数扩展功能

php拼接宏界说技巧_设计筹划和范例 宏拼接办法实现log函数扩展功能

访客 2024-11-06 0

扫一扫用手机浏览

文章目录 [+]

但是考虑到这些库的版本可能会不断更新升级,且我们想要添加的“定制功能”只是当前模块利用,并不是全部系统共同利用的等缘故原由,我们只管即便不要去修正这些log头文件,而是基于这些头文件中原有接口,我们再封装一层log接口进行定制实现。

由于现在的系统普遍性的对性能有比较高的哀求,至少不能有过多的性能摧残浪费蹂躏,而log又不可避免的要进行输出,以是我们在编写或利用log干系代码时,只管即便避免可能导致性能变差的函数或操作,如果避免不了的话也要只管即便减少这些操作的利用频率。

php拼接宏界说技巧_设计筹划和范例  宏拼接办法实现log函数扩展功能

对付既要考虑代码扩展性和预编译期编写代码,又要考虑log函数对性能的影响,那么我们若何实现在原有log上实现分外业务的扩展呢?

php拼接宏界说技巧_设计筹划和范例  宏拼接办法实现log函数扩展功能
(图片来自网络侵删)

下面我就以通过宏拼接的办法先容一个范例的设计方案和编码demo,供大家参考剖析。

范例需求

比如我们现在有个xx系统,但是基于现有日志都是英文,尤其是ERR日志不便于运维查看和应急,以是客户哀求能在监控系统中看到ERR日志的中文解释。

范例设计剖析日志长度是有限定的,以是不能英文和中文一起输出,而且一起输出的话显示也比较乱。
现有代码中的ERR日志比较多,也不能对每一行ERR日志都输出一行中文解释。
否则和英文输出内容输出重复输出了。
而且很多日志是有一定共性的。
中文解释格式须要统一管理

综上:我们根据日志进行梳理、分类,在原有日志代码的根本上输出对应的日志分类标签,并利用分外字符标注出标签信息。
监控系统监控日志时,根据解析出的标签到对应的数据字典中查看提前录入的中文提示。

涉及的知识点

1.利用c++的string类或字符串拼接函数(strcat、snprintf等)是比较耗费性能的,以是须要利用不影响性能的形式进行编写,比如利用宏的符号更换特性。

2.非常常见的一个宏的拼接和展示字符串的宏定义:

#define CONTACT(x,y) x##y //拼接 #define STR(x) #x //转字符串

编码实现

#include <iostream>//---------------底层log头文件范例,实际代码的buf创建和printf不在这里,且实际会比这繁芜的多(不能修正)-----------------------------//底层log头文件中的宏函数定义#define FUN_TEST_LABEL(log_level,...)do{\ if (log_level > 1)\ {\ char buf[1024];\ snprintf(buf, 1024, __VA_ARGS__);\ printf("%s", buf);\ }\}while(0)//---------------业务封装的自己利用的log头文件范例-----------------------------//本次添加的“中转字符用的宏”#define __TO_STR(LABEL) @LABEL@ // 字符串拼接//下面两行的效果一样,把稳:低版本编译器利用第一个时会提示“does not give a valid preprocessing token”缺点//#define PRINTF_TEST(LABEL, ...) #LABEL ## __VA_ARGS__// 宏参数拼接成符号#define PRINTF_TEST(LABEL, ...) #LABEL __VA_ARGS__// 宏参数拼接成符号#define PRINTF_TEST_TEMP(LABEL, ...) PRINTF_TEST(LABEL, __VA_ARGS__)// 宏参数拼接成符号//业务利用log#define LOG_PRINTF_TEST(log_level,LABEL, ...) FUN_TEST_LABEL(log_level,PRINTF_TEST_TEMP(__TO_STR(LABEL),__VA_ARGS__))// 宏参数拼接成符号//日志标签定义----当前我们在日志中输出这些变量对应的名称(字符串),数值在log中不该用,其异日记扩展功能利用。
const int LOG_LABEL_ERROR = 1001;//问题产生缘故原由:xxx 涉及范围:xxx 应急建议:xxx//---------------业务代码中利用log的cpp代码范例-----------------------------int main(){ int a = 666; LOG_PRINTF_TEST(5,LOG_LABEL_ERROR, "%s() hello! %d \n", __FUNCTION__,a); return 0;}

运行结果:

@LOG_LABEL_ERROR@main() hello! 666

宏代码展开效果

备注:

可以通过https://cppinsights.io/网站供应的在线编译工具查看预编译展开代码,也可以通过预处理编译命令(“$ g++ -o test.i -E test.cpp -std=c++11”)天生.i文件进行查看。

详细操作方法可以参考我以前的文章:《大略易用的C++在线编译工具,你值得拥有!
》《探秘!
编译器眼中不一样的变量名》

补充解释宏是在预编译期进行的字符更换,如果代码编译不通过的话,也是无法天生.i文件进行查看。
宏对应的代码未便利调试和查看,在预编译期进行展开后,也会看到影响了原有代码的内容和代码行。

以是,大家在利用宏函数前,最好在cppinsight上编写个demo,看看代码展开后的效果,这样开拓效率能高一些。

关于宏的特点,大家可以参考我以前的文章:《「C++」define、const、constexpr分别有哪些特点?》《代码利用宏和const,到底哪个好?》

标签:

相关文章

PHP实现文字转图片的代码与应用

图片处理技术在各个领域得到了广泛应用。在PHP编程中,文字转图片功能同样具有很高的实用价值。本文将针对PHP实现文字转图片的代码进...

网站建设 2025-03-02 阅读1 评论0

NAN0017探索新型纳米材料的奥秘与应用

纳米技术作为一门新兴的交叉学科,近年来在材料科学、生物医学、电子工程等领域取得了举世瞩目的成果。其中,NAN0017作为一种新型纳...

网站建设 2025-03-02 阅读5 评论0

L26368XO代码其背后的创新与突破

编程语言在各个领域发挥着越来越重要的作用。在众多编程语言中,L26368XO代码以其独特的优势,成为了业界关注的焦点。本文将深入剖...

网站建设 2025-03-02 阅读1 评论0

HTML字体背景打造个化网页设计的关键元素

网页设计已经成为现代网络传播的重要手段。在众多网页设计元素中,字体和背景的搭配尤为关键。本文将从HTML字体背景设置的角度,探讨其...

网站建设 2025-03-02 阅读1 评论0