一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【RT-Thread學(xué)習(xí)筆記】多彩的printf日志輸出

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-07-30 14:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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


以下是正文部分,通過(guò)本文的閱讀,你將了解到以下內(nèi)容:

  • printf帶顏色控制的打印輸出
  • 日志分級(jí)別打印的實(shí)踐

printf帶顏色控制的打印輸出


printf帶顏色輸出,首先需要了解下控制臺(tái)輸出的屬性設(shè)置原理:通過(guò)用一串轉(zhuǎn)義序列將輸出的控制信息嵌入到printf語(yǔ)句中

【轉(zhuǎn)義序列】是以控制字符'ESC'開(kāi)頭。該字符的ASCII碼十進(jìn)制表示為27,十六進(jìn)制表示為0x1B,八進(jìn)制表示為033。多數(shù)轉(zhuǎn)義序列超過(guò)兩個(gè)字符,故通常以'ESC'和左括號(hào)'['開(kāi)頭。該起始序列稱(chēng)為控制序列引導(dǎo)符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。通過(guò)轉(zhuǎn)義序列設(shè)置終端顯示屬性時(shí),可采用以下格式:

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

其中,'\033['或'\e['引導(dǎo)轉(zhuǎn)義序列,'m'表示設(shè)置屬性并結(jié)束轉(zhuǎn)義序列。Param為屬性值,{...}表示可選(多個(gè)參數(shù)之間用分號(hào)隔開(kāi),與順序無(wú)關(guān))。

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

好了,基本知識(shí)就介紹到,以下是前面圖片對(duì)應(yīng)的示例代碼。

#include 

/*
顯示:0(默認(rèn))、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無(wú)下劃線)、5(閃爍)、25(無(wú)閃爍)、7(反顯、翻轉(zhuǎn)前景色和背景色)、27(無(wú)反顯)
顏色值:0(黑)、1(紅)、2(綠)、 3(黃)、4(藍(lán))、5(紫)、6(深綠)、7(白)
顏色分為背景色和字體色,30~39(30+顏色值)用來(lái)設(shè)置字體色(前景色),40~49(40+顏色值)設(shè)置背景(背景色):如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" //藍(lán)色高亮
#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" //白色高亮

/*
日志級(jí)別定義,數(shù)值越小,級(jí)別越高
*/
#define LOGGER_FATAL_LEVEL			1 	//致命錯(cuò)誤,不可恢復(fù)
#define LOGGER_ERROR_LEVEL			2	//一般錯(cuò)誤,可恢復(fù)
#define LOGGER_WARN_LEVEL			3	//警告
#define LOGGER_INFO_LEVEL			4	//信息
#define LOGGER_DEBUG_LEVEL			5	//調(diào)試

/*
當(dāng)前日志級(jí)別配置
*/
#define LOGGER_CFG_LEVEL			LOGGER_DEBUG_LEVEL

/*
根據(jù)配置的日志級(jí)別輸出日志
*/
#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__);
	
    /* 測(cè)試不同的日志輸出 */
    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

日志分級(jí)別打印的實(shí)踐


示例代碼中將日志分為五個(gè)級(jí)別,從對(duì)運(yùn)行的影響的重要性,從高到低分別是: 致命錯(cuò)誤、普通錯(cuò)誤、警告、信息、調(diào)試。

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

普通錯(cuò)誤error級(jí)別的日志使用 “高亮紅色輸出”;

警告warn級(jí)別的日志使用 “高亮黃色輸出”;

信息info級(jí)別的日志使用 “高亮藍(lán)色輸出”

調(diào)試debug級(jí)別的日志使用 “高亮白色輸出”;

另外,有個(gè)宏LOGGER_CFG_LEVEL 可以配置當(dāng)前的日志級(jí)別,此項(xiàng)配置的含義是,當(dāng)需要輸出的日志級(jí)別比配置的日志級(jí)別高時(shí),該日志就會(huì)被最終輸出,否則該日志則會(huì)被拋棄。【數(shù)值越小,表示日志級(jí)別越高】

示例代碼中配置的是debug級(jí)別,所以所有級(jí)別的日志都會(huì)被輸出。我們?cè)囅滦薷娜罩炯?jí)別配置,配置成warn級(jí)別:

/*
當(dāng)前日志級(jí)別配置
*/
#define LOGGER_CFG_LEVEL			LOGGER_WARN_LEVEL
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

編譯后測(cè)試下

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


好了,關(guān)于printf帶顏色輸出和日志分級(jí)別輸出的內(nèi)容就介紹到這里,如果你覺(jué)得有幫助,可以試著應(yīng)用在你的工程中,讓你的日志輸出高效起來(lái)吧 ?。?!

?審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141674
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1406

    瀏覽量

    41924
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    14238
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread學(xué)習(xí)筆記】使用scons命令生成靜態(tài)庫(kù)

    RT-Thread學(xué)習(xí)筆記】如何使用scons 命令中buildlib的生成靜態(tài)庫(kù)?
    的頭像 發(fā)表于 07-27 09:13 ?7091次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】使用scons命令生成靜態(tài)庫(kù)

    RT-Thread Nano入門(mén)學(xué)習(xí)筆記

    RT-Thread Nano入門(mén)學(xué)習(xí)筆記
    發(fā)表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> Nano入門(mén)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用

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

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記
    發(fā)表于 01-25 18:19 ?9次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記
    發(fā)表于 01-25 18:23 ?6次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記
    發(fā)表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象初始化鏈表組織方式

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象操作API

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記
    發(fā)表于 01-25 18:26 ?7次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象操作API

    RT-Thread學(xué)習(xí)筆記分享

    我是從2020年11月初開(kāi)始學(xué)習(xí)RT-Thread實(shí)時(shí)操作系統(tǒng)的,在學(xué)習(xí)RT-Thread之前,我接觸過(guò)uCOS和FreeRTOS,但這兩個(gè)在單片機(jī)上應(yīng)用的實(shí)時(shí)操作系統(tǒng),我都沒(méi)有仔細(xì)并
    的頭像 發(fā)表于 01-27 18:52 ?2596次閱讀

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡(jiǎn)介 作為一名 RTOS 的初學(xué)者,也許你對(duì) RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類(lèi)型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?5026次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread學(xué)習(xí)筆記】Makefile的FORCE

    RT-Thread學(xué)習(xí)筆記】十分鐘學(xué)會(huì)Makefile的FORCE
    的頭像 發(fā)表于 07-30 13:55 ?3156次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】Makefile的FORCE

    RT-Thread學(xué)習(xí)筆記】如何抓取終端的網(wǎng)絡(luò)報(bào)文

    RT-Thread學(xué)習(xí)筆記】如何抓取終端的網(wǎng)絡(luò)報(bào)文?
    的頭像 發(fā)表于 07-30 13:57 ?3440次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】如何抓取終端的網(wǎng)絡(luò)報(bào)文

    RT-Thread學(xué)習(xí)筆記】用memwatch排除內(nèi)存泄露

    RT-Thread學(xué)習(xí)筆記】使用memwatch排除內(nèi)存泄露
    的頭像 發(fā)表于 07-30 14:01 ?2943次閱讀
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】用memwatch排除內(nèi)存泄露

    RT-Thread文檔_ulog 日志

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

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開(kāi)啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?5244次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>學(xué)習(xí)</b>