不會吧,你還在赤裸裸的使用printf?
哈嘍,夥計們!
最近做了一些Linux應用開發方面的東西,感覺現在有點混亂,所以想將每個知識點模塊化,並且能夠搭建自己的API庫,方便以後能夠直接使用!
今天主要來討論一下我們最常用的列印字符串,實現調試列印和顏色列印。
1、明確需求
在Linux開發環境下,我們日常使用的列印字符串的主要需求可能有兩種:
- 多級別列印:我們調試列印信息可以分為多個級別,全局設置列印級別,來實現列印的全局管理!
- 多顏色列印:不同的列印級別對應不同的列印色彩,方便快速吸引開發者的注意力,快速定位問題!
基於以上兩個基本需求,我們來進行簡單封裝。
2、列印級別分類
列印級別參考內核的分類,設置級別如下:
typedef enum {
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、列印信息添加
在輸出我們正常列印信息之前,我們也需要添加一些時間信息,列印級別信息等。
const char global_log_level_string[8][10] = {"EMERG", "ALERT", "CRIT", "ERR", "WARNING", "NOTICE", "INFO", "DEBUG"};
static char 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-21 09:13:54 INFO] log info output
嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!
無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。
點擊這裡找小助理0元領取:點擊文中藍色字體領取吖
5、顏色定義
顏色控制如何做?
很簡單,在輸出字符串前,符合特定的顏色控制格式,就可以更改列印顏色了。
printf("\033[顯示方式;字背景顏色;字體顏色m…\033[0m")
控制命令以\033[開頭,以m結尾,而中間則是屬性碼,屬性代碼之間使用;分隔,如\033[1;34;42m,最後以默認顏色\033[0m結尾,以避免影響後面正常列印!
顯示方式
意義顯示方式默認0高亮顯示1下劃線4閃爍5反白顯示7不可見8
前景顏色和背景顏色
顏色前景色背景色黑色3040紅色3141綠色3242黃色3343藍色3444紫紅色3545青藍色3646白色3747
沒有設置的話就是默認
顏色定義
下方定義一些常用顏色,方便列印調用。
#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文件加入到自己工程即可使用!
文章連結:https://mp.weixin.qq.com/s/Pmpu1W0FU9pMUuIf8DeHPg
轉載自:DonGe 嵌入式藝術
文章來源:不會吧,你還在赤裸裸的使用printf?
版權申明:本文來源於網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。