

不会吧,你还在赤裸裸的使用Printf?
source link: https://www.51cto.com/article/721491.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

哈喽,伙计们!
最近做了一些Linux应用开发方面的东西,感觉现在有点混乱,所以想将每个知识点模块化,并且能够搭建自己的API库,方便以后能够直接使用!
今天主要来讨论一下我们最常用的打印字符串,实现调试打印和颜色打印。
1、明确需求
在Linux开发环境下,我们日常使用的打印字符串的主要需求可能有两种:
- 多级别打印:我们调试打印信息可以分为多个级别,全局设置打印级别,来实现打印的全局管理!
- 多颜色打印:不同的打印级别对应不同的打印色彩,方便快速吸引开发者的注意力,快速定位问题!
基于以上两个基本需求,我们来进行简单封装。
2、打印级别分类
打印级别参考内核的分类,设置级别如下:
typedefenum {
LOG_EMERG=0, /**< Emergency */
LOG_ALERT, /**< Alert */
LOG_CRIT, /**< Critical */
LOG_ERR, /**< Error */
LOG_WARNING, /**< Warning */
LOG_NOTICE, /**< Notice */
LOG_INFO, /**< Information */
LOG_DEBUG /**< Debug */
}GLOBAL_LOG_LEVEL;
3、打印级别控制
打印级别分类后,我们定义全局变量,来全局控制打印级别。
GLOBAL_LOG_LEVEL g_log_level = LOG_INFO; // default log level
/**
* @brief 设置LOG打印等级
*
* @param log_level
*/
void Set_Log_Lever(GLOBAL_LOG_LEVEL log_level){
g_log_level = log_level;
}
如果需要全局调整打印级别,我们可以调用Set_Log_Lever的接口,实现打印级别的适时调整。
4、打印信息添加
在输出我们正常打印信息之前,我们也需要添加一些时间信息,打印级别信息等。
constchar global_log_level_string[8][10] = {"EMERG", "ALERT", "CRIT", "ERR", "WARNING", "NOTICE", "INFO", "DEBUG"};
staticchar str_tmp[512];
// 增加时间信息
time_t now;
time(&now);
strftime(str_tmp, sizeof(str_tmp), "[%Y-%m-%d %H:%M:%S ", localtime(&now));
//加入LOG后缀信息
strcat(str_tmp,global_log_level_string[level]);
strcat(str_tmp, "] ");
通过以上代码,将时间和打印级别信息都添加到字符串之前。
输出效果如下:
[2022-10-2109:13:54 INFO] log info output
5、颜色定义
颜色控制如何做?
很简单,在输出字符串前,符合特定的颜色控制格式,就可以更改打印颜色了。
printf("\033[显示方式;字背景颜色;字体颜色m…\033[0m")
控制命令以\033[开头,以m结尾,而中间则是属性码,属性代码之间使用;分隔,如\033[1;34;42m,最后以默认颜色\033[0m结尾,以避免影响后面正常打印!
前景颜色和背景颜色
没有设置的话就是默认
下方定义一些常用颜色,方便打印调用。
#define LOG_CLRSTR_NONE "\033[0m" // 默认显示
#define LOG_CLRSTR_RED "\033[0;42;31m" // 绿红色
#define LOG_CLRSTR_GREEN "\033[0;32m" // 绿色
#define LOG_CLRSTR_BLUE "\033[0;32;34m" // 蓝色
#define LOG_CLRSTR_DARK_GRAY "\033[1;30m" // 灰色
#define LOG_CLRSTR_CYAN "\033[0;36m" // 青色
#define LOG_CLRSTR_PURPLE "\033[0;35m" // 紫色
#define LOG_CLRSTR_BROWN "\033[0;33m" // 棕色
#define LOG_CLRSTR_YELLOW "\033[5;42;33m" // 绿黄色
#define LOG_CLRSTR_WHITE "\033[1;37m" // 白色
6、颜色控制
定义完各类颜色后,我们要做的就是对于不同级别的打印,选择不同的颜色!
//LOG类型判断,选择不同打印颜色
switch (level)
{
case LOG_EMERG:
log_color = LOG_CLRSTR_RED;
break;
case LOG_ALERT:
log_color = LOG_CLRSTR_BLUE;
break;
case LOG_CRIT:
log_color = LOG_CLRSTR_CYAN;
break;
case LOG_ERR:
log_color = LOG_CLRSTR_RED;
break;
case LOG_WARNING:
log_color = LOG_CLRSTR_PURPLE;
break;
case LOG_NOTICE:
log_color = LOG_CLRSTR_YELLOW;
break;
case LOG_INFO:
log_color = LOG_CLRSTR_DARK_GRAY;
break;
case LOG_DEBUG:
log_color = LOG_CLRSTR_BROWN;
break;
default:
log_color = LOG_CLRSTR_GREEN;
break;
}
7、颜色打印
在选择对应颜色之后,我们要做的就是将这些颜色信息,放到正常打印信息的前方。
可以通过字符串拼接的函数实现。
// 重新设置标准输出
sprintf(str_uart, "%s",log_color);
strcat(str_uart, str_tmp);
...
strcat(str_uart,LOG_CLRSTR_NONE);
strcat(str_uart, "\r\n");
printf("%s",str_uart);
这里的颜色打印,说白了就是在我们要打印的字符串前方,加入打印颜色的信息即可,打印字符串结束之后,要加上\033[0m,来恢复默认!
8、打印预览
设置完成之后,我们看一下打印预览:

9、Demo获取
多级别彩色打印这个功能,已经封装成了一个API,我们直接获取源码,将.c和.h文件加入到自己工程即可使用!
Recommend
-
64
-
77
-
50
怎么跟爱挑剔的领导相处?怎么对付一天三个主意的上司?
-
59
直觉告诉我我A股真正的大跌还没开始呢,这次的反弹其实是赤裸裸的诱多。 - 我一拍脑袋,我怎么感觉A股真正的大跌还没开始呢,这次的反弹其实是赤裸裸的诱多。就因为这种直觉,让我在15年4500点逃顶,18年年初逃顶。我也说不出为什么,就是这种感觉非常强烈,所以空...
-
12
全栈的自我修养: 0004 Java 包扫描实现和应用(File篇) I may not be able to change the past, but I can learn from it. 我也许不能改变过去发生的事情,但能向过去学习。 Table of Contents ...
-
6
不会吧,是关卡设计的练习题最近些许游戏行业的老师们会私信询问从事关卡设计是否需要学习建筑设计。这是个尴尬的问题,至少我所知的国内建筑教育并不适合各位老师在行业上速成的期望,加上关卡设计在原则上的运用比建筑设计来得自由许多,以至于对于...
-
6
不会吧!不会吧!产品经理不会没有女朋友吧!? 产品经理个个都是人才,说话又好听,会没有女朋友?需求分析、目标画像、用户体验咋就白给了呢?程序猿都哄得好,你哄不好女朋友?
-
10
币圈:马斯克为什么敢这么赤裸裸割韭菜 - 耳朵财经 币圈:马斯克为什么敢这么赤裸裸割韭菜 幸运2021 2021-05-21 10:09 ...
-
7
新的项目要开始了,由于项目中涉及到和第三方厂商的接口对接,所有对接口的安全性有要求,下来我们看看如何写好一个规范的接口 如何保证接口传输中数据安全 保证数据安全,大家首先能想到的就是对内容进行加密。加密的话主要有...
-
3
不会吧?到现在还有人不了解买家秀红人视频? ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK