色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【RT-Thread學習筆記】多彩的printf日志輸出

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-07-30 14:05 ? 次閱讀

?使用過C語言的童鞋都知道,使用printf可以在終端(控制臺或者串口等輸出設備)輸出信息,這為我們平時調試程序提供了便利,只是我們通常的打印用法,僅僅是 printf("Hello World !\r\n"); 毫無生氣,控制臺也僅僅是輸出,白底黑字的 Hello World !

今天我將給大家介紹一種帶顏色輸出的printf用法,從此你將告訴枯燥單調的輸出,你的日志也可以變成屬于你自己的“藝術品”!話不多說,先來張圖感受下 !!! 注意 72 行的輸出其實是間隙閃爍的哦,只不過截圖了感受不出來。


以下是正文部分,通過本文的閱讀,你將了解到以下內容:

  • printf帶顏色控制的打印輸出
  • 日志分級別打印的實踐

printf帶顏色控制的打印輸出


printf帶顏色輸出,首先需要了解下控制臺輸出的屬性設置原理:通過用一串轉義序列將輸出的控制信息嵌入到printf語句中

【轉義序列】是以控制字符'ESC'開頭。該字符的ASCII碼十進制表示為27,十六進制表示為0x1B,八進制表示為033。多數轉義序列超過兩個字符,故通常以'ESC'和左括號'['開頭。該起始序列稱為控制序列引導符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。通過轉義序列設置終端顯示屬性時,可采用以下格式:

\033[ Param {;Param;...}m 或 \e[ Param {;Param;...}m
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

其中,'\033['或'\e['引導轉義序列,'m'表示設置屬性并結束轉義序列。Param為屬性值,{...}表示可選(多個參數之間用分號隔開,與順序無關)。

【顏色】是通過添加專用序列來選擇的 -- 基本上是夾在 "\e["和 "m" 之間數字值。如果指定一個以上的數字代碼,則用分號將它們分開。例如"\e[31;40m";第一個數字(31)為前景顏色(紅色);第二個數字為(40)背景顏色(黑色); "\e[0m" 表示關閉設置屬性。
【顯示】:0(默認)、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無下劃線)、5(閃爍)、25(無閃爍)、7(反顯、翻轉前景色和背景色)、27(無反顯)
【顏色值】:0(黑)、1(紅)、2(綠)、 3(黃)、4(藍)、5(紫)、6(深綠)、7(白);顏色分為背景色和字體色,30~39(30+顏色值)用來設置字體色(前景色),40~49(40+顏色值)設置背景(背景色):如31表示前景色為紅色,41表示背景色為紅色。

好了,基本知識就介紹到,以下是前面圖片對應的示例代碼。

#include 

/*
顯示:0(默認)、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無下劃線)、5(閃爍)、25(無閃爍)、7(反顯、翻轉前景色和背景色)、27(無反顯)
顏色值:0(黑)、1(紅)、2(綠)、 3(黃)、4(藍)、5(紫)、6(深綠)、7(白)
顏色分為背景色和字體色,30~39(30+顏色值)用來設置字體色(前景色),40~49(40+顏色值)設置背景(背景色):如31表示前景色為紅色,41表示背景色為紅色。
*/
#define COLOR_NONE         			"\033[0;m"  
#define RED          				"\033[0;31m"
#define LIGHT_RED    				"\033[1;31m"  //紅色高亮
#define LIGHT_RED_INV    			"\033[5;7;31m"  //紅色高亮,并反白顯示,字體閃爍
#define GREEN        				"\033[0;32m"
#define LIGHT_GREEN  				"\033[1;32m"
#define BLUE         				"\033[0;34m"
#define LIGHT_BLUE   				"\033[1;34m" //藍色高亮
#define DARY_GRAY    				"\033[1;30m"
#define CYAN         				"\033[0;36m"
#define LIGHT_CYAN   				"\033[1;36m"
#define PURPLE       				"\033[0;35m"
#define LIGHT_PURPLE 				"\033[1;35m"
#define YELLOW        				"\033[0;33m"
#define LIGHT_YELLOW       			"\033[1;33m" //黃色高亮
#define WHITE                                   "\033[0;37m"
#define LIGHT_WHITE        			"\033[1;37m" //白色高亮

/*
日志級別定義,數值越小,級別越高
*/
#define LOGGER_FATAL_LEVEL			1 	//致命錯誤,不可恢復
#define LOGGER_ERROR_LEVEL			2	//一般錯誤,可恢復
#define LOGGER_WARN_LEVEL			3	//警告
#define LOGGER_INFO_LEVEL			4	//信息
#define LOGGER_DEBUG_LEVEL			5	//調試

/*
當前日志級別配置
*/
#define LOGGER_CFG_LEVEL			LOGGER_DEBUG_LEVEL

/*
根據配置的日志級別輸出日志
*/
#define logger_level_printf(level, fmt, arg...)\
	do {\
		if (level <= LOGGER_CFG_LEVEL) {\
			printf("[%s,%d] "fmt, __FILE__, __LINE__, ##arg);\
		}\
	} while(0)

#define logger_fatal(fmt, arg...)	logger_level_printf(LOGGER_FATAL_LEVEL, LIGHT_RED_INV fmt COLOR_NONE, ##arg)		
#define logger_error(fmt, arg...)	logger_level_printf(LOGGER_ERROR_LEVEL, LIGHT_RED fmt COLOR_NONE, ##arg)
#define logger_warn(fmt, arg...)	logger_level_printf(LOGGER_WARN_LEVEL, LIGHT_YELLOW fmt COLOR_NONE, ##arg)
#define logger_info(fmt, arg...)	logger_level_printf(LOGGER_INFO_LEVEL, LIGHT_BLUE fmt COLOR_NONE, ##arg)
#define logger_debug(fmt, arg...)	logger_level_printf(LOGGER_DEBUG_LEVEL, LIGHT_WHITE fmt COLOR_NONE, ##arg)

int main(int argc, const char *argv[])
{
    /* 普通的printf輸出 */
    printf("This is my function called %s() ...\n", __func__);
	
    /* 測試不同的日志輸出 */
    logger_fatal("This fatal log ...\r\n");
    logger_error("This error log ...\r\n");
    logger_warn("This warn log ...\r\n");
    logger_info("This info log ...\r\n");
    logger_debug("This debug log ...\r\n");
	
    return 0;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

日志分級別打印的實踐


示例代碼中將日志分為五個級別,從對運行的影響的重要性,從高到低分別是: 致命錯誤、普通錯誤、警告、信息、調試

致命錯誤fatal級別的日志使用 “高亮紅色輸出,并且反色輸出,同時字體間隙閃爍”

普通錯誤error級別的日志使用 “高亮紅色輸出”

警告warn級別的日志使用 “高亮黃色輸出”

信息info級別的日志使用 “高亮藍色輸出”

調試debug級別的日志使用 “高亮白色輸出”

另外,有個宏LOGGER_CFG_LEVEL 可以配置當前的日志級別,此項配置的含義是,當需要輸出的日志級別比配置的日志級別高時,該日志就會被最終輸出,否則該日志則會被拋棄。【數值越小,表示日志級別越高】

示例代碼中配置的是debug級別,所以所有級別的日志都會被輸出。我們試下修改日志級別配置,配置成warn級別:

/*
當前日志級別配置
*/
#define LOGGER_CFG_LEVEL			LOGGER_WARN_LEVEL
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

編譯后測試下

這基本就達到了我們需要控制日志輸出的需求。


好了,關于printf帶顏色輸出和日志分級別輸出的內容就介紹到這里,如果你覺得有幫助,可以試著應用在你的工程中,讓你的日志輸出高效起來吧 !!!

?審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140200
  • RT-Thread
    +關注

    關注

    32

    文章

    1368

    瀏覽量

    41499
  • Printf
    +關注

    關注

    0

    文章

    84

    瀏覽量

    14077
收藏 0人收藏
  • szullc1

評論

相關推薦
熱點推薦

RT-Thread學習筆記】使用scons命令生成靜態庫

RT-Thread學習筆記】如何使用scons 命令中buildlib的生成靜態庫?
的頭像 發表于 07-27 09:13 ?6785次閱讀
【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】使用scons命令生成靜態庫

RT-Thread學習筆記】RISC-V匯編基礎三大塊知識

RT-Thread學習筆記】RISC-V匯編基礎的三大塊知識
的頭像 發表于 07-30 11:01 ?3108次閱讀
【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】RISC-V匯編基礎三大塊知識

RT-Thread Nano入門學習筆記

RT-Thread Nano入門學習筆記
發表于 11-26 12:36 ?20次下載
<b class='flag-5'>RT-Thread</b> Nano入門<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

RT-Thread 應用筆記 - RTC Alarm 組件的使用

RT-Thread 應用筆記 - 不正確使用LOG也會引發hard faultRT-Thread 應用筆記 - RTC Alarm 組件的使用RT-
發表于 01-25 18:18 ?10次下載
<b class='flag-5'>RT-Thread</b> 應用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用

RT-Thread 內核學習筆記 - 理解defunct僵尸線程

RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:19 ?9次下載
<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程

RT-Thread 內核學習筆記 - 設備模型rt_device的理解

RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:19 ?8次下載
<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 設備模型<b class='flag-5'>rt</b>_device的理解

RT-Thread 內核學習筆記 - 內核對象鏈表結構深入理解

RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:23 ?6次下載
<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象鏈表結構深入理解

RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式

RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:24 ?3次下載
<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象初始化鏈表組織方式

RT-Thread 內核學習筆記 - 內核對象操作API

RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記
發表于 01-25 18:26 ?7次下載
<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象操作API

RT-Thread學習筆記 RT-Thread的架構概述

RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
的頭像 發表于 07-09 11:27 ?4895次閱讀
<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構概述

RT-Thread學習筆記】Makefile的FORCE

RT-Thread學習筆記】十分鐘學會Makefile的FORCE
的頭像 發表于 07-30 13:55 ?3043次閱讀
【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】Makefile的FORCE

RT-Thread學習筆記】如何抓取終端的網絡報文

RT-Thread學習筆記】如何抓取終端的網絡報文?
的頭像 發表于 07-30 13:57 ?3284次閱讀
【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】如何抓取終端的網絡報文

RT-Thread學習筆記】用memwatch排除內存泄露

RT-Thread學習筆記】使用memwatch排除內存泄露
的頭像 發表于 07-30 14:01 ?2779次閱讀
【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】用memwatch排除內存泄露

RT-Thread文檔_ulog 日志

RT-Thread文檔_ulog 日志
發表于 02-22 18:42 ?1次下載
<b class='flag-5'>RT-Thread</b>文檔_ulog <b class='flag-5'>日志</b>

基于RT-Thread Studio學習

前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
的頭像 發表于 05-15 11:00 ?4989次閱讀
基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>學習</b>
主站蜘蛛池模板: 一本道综合久久免费 | WINDOWSCHANNEL老太| 攻把受做哭边走边肉楼梯PLAY | 99热精品在线视频观看 | hdxxxx58丝袜连裤袜 | AV天堂午夜精品一区 | 国产精品永久AV无码视频 | 男人桶爽女人 | 亚洲精品嫩草研究院久久 | 亚洲精品国产品国语在线试看 | 伊人狼人久久精品热9 | 国产精品久久久久久久久久久 | 中文字幕在线播放视频 | 亚洲一区二区影院 | 久久合| 漂亮妈妈中文字幕版 | 翁熄性放纵交换01 | 国产小视频国产精品 | 免费在线视频a | 欧美美女性生活 | 一个人在线观看免费高清视频 | 美丽的姑娘BD在线观看 | 女人吃男人的鸡鸡 | 青青草原亚洲 | 日本无码毛片一区二区手机看 | 亚洲AV永久无码精品老司机蜜桃 | 欧美成人免费观看久久 | 69国产精品人妻无码免费 | 欧美高跟镣铐bdsm视频 | 男gv纯肉免费视频 | 国产成人精品免费视频软件 | u15女少天堂写真 | 国产日韩欧美另类 | 果冻传媒在线完整免费播放 | 亚洲AV怡红院影院怡春院 | 全黄h全肉细节全文 | 99久久国内精品成人免费 | 国产又爽又黄又不遮挡视频 | 日韩AV无码一区二区三区不卡毛片 | 父亲在线日本综艺免费观看全集 | 亚洲精品线在线观看 |

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品