哈嘍,伙計們!
最近做了一些Linux?應用開發(fā)方面的東西,感覺現(xiàn)在有點混亂,所以想將每個知識點模塊化,并且能夠搭建自己的API庫,方便以后能夠直接使用!
今天主要來討論一下我們最常用的打印字符串,實現(xiàn)調(diào)試打印和顏色打印。
1、明確需求
在Linux開發(fā)環(huán)境下,我們?nèi)粘J褂玫拇蛴∽址闹饕枨罂赡苡袃煞N:
- 多級別打?。何覀冋{(diào)試打印信息可以分為多個級別,全局設(shè)置打印級別,來實現(xiàn)打印的全局管理!
- 多顏色打印:不同的打印級別對應不同的打印色彩,方便快速吸引開發(fā)者的注意力,快速定位問題!
基于以上兩個基本需求,我們來進行簡單封裝。
2、打印級別分類
打印級別參考內(nèi)核的分類,設(shè)置級別如下:
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 設(shè)置LOG打印等級
*
* @param log_level
*/
void Set_Log_Lever(GLOBAL_LOG_LEVEL log_level){
g_log_level = log_level;
}
如果需要全局調(diào)整打印級別,我們可以調(diào)用Set_Log_Lever的接口,實現(xiàn)打印級別的適時調(diào)整。
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?結(jié)尾,而中間則是屬性碼,屬性代碼之間使用;?分隔,如\033[1;34;42m?,最后以默認顏色\033[0m結(jié)尾,以避免影響后面正常打??!
顯示方式
意義
| 顯示方式
|
默認
| 0
|
高亮顯示
| 1
|
下劃線
| 4
|
閃爍
| 5
|
反白顯示
| 7
|
不可見
| 8
|
前景顏色和背景顏色
顏色
| 前景色
| 背景色
|
黑色
| 30
| 40
|
紅色
| 31
| 41
|
綠色
| 32
| 42
|
黃色
| 33
| 43
|
藍色
| 34
| 44
|
紫紅色
| 35
| 45
|
青藍色
| 36
| 46
|
白色
| 37
| 47
|
沒有設(shè)置的話就是默認
顏色定義
下方定義一些常用顏色,方便打印調(diào)用。
#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、顏色打印
在選擇對應顏色之后,我們要做的就是將這些顏色信息,放到正常打印信息的前方。
可以通過字符串拼接的函數(shù)實現(xiàn)。
// 重新設(shè)置標準輸出
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);
這里的顏色打印,說白了就是在我們要打印的字符串前方,加入打印顏色的信息即可,打印字符串結(jié)束之后,要加上\033[0m,來恢復默認!
8、打印預覽
設(shè)置完成之后,我們看一下打印預覽:

9、Demo獲取
多級別彩色打印這個功能,已經(jīng)封裝成了一個API?,我們直接獲取源碼,將.c和.h文件加入到自己工程即可使用!