如何讓你的C程序打印的Log多一點色彩?
在平常的調(diào)試中,printf字體格式與顏色都是默認(rèn)一致的。
如果可以根據(jù)log信息的重要程度,配以不同的顏色與格式,可以很方便的查找到要點。
1、printf字體顯示語法說明
printf(“\033[顯示方式;字體顏色;背景顏色m 字符串 \033[0m” );
圖片
語法說明:
- 第一個**\033[**表示轉(zhuǎn)義序列的開始,設(shè)置隨后的字體格式 轉(zhuǎn)義序列是以 ESC 開頭,用 \033 完成相同的工作(ESC 的 ASCII 碼用十進(jìn)制表示就是 27, = 用八進(jìn)制表示的 33)。
- 顯示方式:0:默認(rèn)值 1:高亮 、22:非粗體、4:下劃線、24:非下劃線、5:閃爍、25:非閃爍、7:反顯、27:非反顯
- 字體顏色30: 黑 31: 紅 32: 綠 33: 黃 34: 藍(lán) 35: 紫 36: 深綠 37: 白色
- 背景顏色40: 黑 41: 紅 42: 綠 43: 黃 44: 藍(lán) 45: 紫 46: 深綠 47: 白色
- 紅色 'm':表示轉(zhuǎn)義序列的結(jié)束
- 結(jié)尾處的**\033[0m**是恢復(fù)默認(rèn)值。
其他ANSI控制碼:
/033[0m 關(guān)閉所有屬性
/033[1m 設(shè)置高亮度
/033[4m 下劃線
/033[5m 閃爍
/033[7m 反顯
/033[8m 消隱
/033[30m -- /033[37m 設(shè)置前景色
/033[40m -- /033[47m 設(shè)置背景色
/033[nA 光標(biāo)上移n行
/033[nB 光標(biāo)下移n行
/033[nC 光標(biāo)右移n行
/033[nD 光標(biāo)左移n行
/033[y;xH設(shè)置光標(biāo)位置
/033[2J 清屏
/033[K 清除從光標(biāo)到行尾的內(nèi)容
/033[s 保存光標(biāo)位置
/033[u 恢復(fù)光標(biāo)位置
/033[?25l 隱藏光標(biāo)
/033[?25h 顯示光標(biāo)
注意: 其中 顯示方式;字體顏色;背景顏色 可以任意組合,";"隔開即可。 使用 ANSI 轉(zhuǎn)義碼來設(shè)置文本樣式和顏色可能會因為不同的終端軟件和操作系統(tǒng)而產(chǎn)生不同的效果。 同時,這種方式也只適用于在終端上輸出,如果需要在 GUI 程序中設(shè)置文本顏色等效果,則需要使用相應(yīng)的 GUI 庫提供的接口。
2、舉例
printf("\033[1;31mThis text is in red and bold.\033[0m\n");
printf("\033[0;31mThis text is in red and not bold.\033[0m\n");
其中,'1' 表示加粗或高亮,'31' 表示前景色為紅色,'\033[' 是轉(zhuǎn)義序列的開始,'m' 是轉(zhuǎn)義序列的結(jié)束,'\033[0m' 表示將屬性重置為默認(rèn)值。
運行結(jié)果:
圖片
方式
printf("\033[0;36m****一口Linux*****【0;36m】\033[0m\r\n");
printf("\033[1;36m****一口Linux*****【1;36m】\033[0m\r\n");
printf("\033[4;36m****一口Linux*****【4;36m】\033[0m\r\n");
printf("\033[5;36m****一口Linux*****【5;36m】\033[0m\r\n");
printf("\033[7;36m****一口Linux*****【7;36m】\033[0m\r\n");
printf("\033[8;36m****一口Linux*****【8;36m】\033[0m\r\n");
printf("\033[22;36m****一口Linux*****【22;36m】\033[0m\r\n");
printf("\033[24;36m****一口Linux*****【24;36m】\033[0m\r\n");
printf("\033[25;36m****一口Linux*****【25;36m】\033[0m\r\n");
printf("\033[27;36m****一口Linux*****【27;36m】\033[0m\r\n");
圖片
色譜
測試代碼[僅打印字體顏色]
printf("\033[30m****一口Linux*****【30】\033[0m\r\n");
printf("\033[31m****一口Linux*****【31】\033[0m\r\n");
printf("\033[32m****一口Linux*****【32】\033[0m\r\n");
printf("\033[33m****一口Linux*****【33】\033[0m\r\n");
printf("\033[34m****一口Linux*****【34】\033[0m\r\n");
printf("\033[35m****一口Linux*****【35】\033[0m\r\n");
printf("\033[36m****一口Linux*****【36】\033[0m\r\n");
printf("\033[37m****一口Linux*****【37】\033[0m\r\n");
printf("\033[40m****一口Linux*****【40】\033[0m\r\n");
printf("\033[41m****一口Linux*****【41】\033[0m\r\n");
printf("\033[42m****一口Linux*****【42】\033[0m\r\n");
printf("\033[43m****一口Linux*****【43】\033[0m\r\n");
printf("\033[44m****一口Linux*****【44】\033[0m\r\n");
printf("\033[45m****一口Linux*****【45】\033[0m\r\n");
printf("\033[46m****一口Linux*****【46】\033[0m\r\n");
printf("\033[47m****一口Linux*****【47】\033[0m\r\n");
圖片
3、給打印信息封裝
為方便打印字符串為不同顏色,我們可以將一些常用的顏色定義成宏
#define HL_TWK_RED_YEL "\033[1m\033[5;31;43m" //閃爍高亮紅字黃底
#define HL_RED_WRT "\033[1;31;47m" //高亮紅色白底
#define HL_RED "\033[1;31m" //高亮紅色
#define HL_GRN "\033[1;32m" //高亮綠色
#define HL_YEL "\033[1;33m" //高亮黃色
#define HL_DGRN "\033[1;36m" //高亮深綠
#define PF_CLR "\033[0m" //清除
將系統(tǒng)提供的printf函數(shù)做一個封裝:
#define myprintf(color, format, args...) \
do{ \
printf(color); \
printf(format, ##args); \
printf(PF_CLR); \
}while(0)
比如我們要打印字符串,顯示為高亮黃色
myprintf(HL_YEL,"%s\n","yikoulinux");
4. 美化程序的打印log
假設(shè)我們有如下格式的通信信令:
圖片
調(diào)試通信協(xié)議,我們經(jīng)常需要將通信的信令以16進(jìn)制格式全部打印出來,這些數(shù)據(jù)看起來非常不直觀,
為方便查看log,將幾個最重要字段顯示出來。
比如msgType、len。
void dump_frm(char *title,UINT8 *data,int len)
{
int i=0;
myprintf(HL_YEL,"%s\n",title);
for(i=0;i<len;i++)
{
if(i==0){
myprintf(HL_RED,"%02x ",data[i]);
}else if(i==3 || i==4){
myprintf(HL_DGRN,"%02x ",data[i]);
}
else{
myprintf(HL_GRN,"%02x ",data[i]);
}
}
putchar('\n');
}
將我們的測試針數(shù)據(jù),放進(jìn)去測試一下:
UCHAR frm[]={0x12,0x34,0x56,0x00,0x07,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
dump_frm("frm<<<",frm,sizeof(frm));
執(zhí)行結(jié)果:
圖片
可以看到,這種幀格式,看起來會更加直觀。
5、完整代碼
國際慣例,貼上完整代碼。
需要的老鐵,直接拷貝帶你們的項目里吧!
#include <stdio.h>
#include <string.h>
typedef unsigned char UCHAR;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
#pragma pack(1)
typedef struct protocol_msg_align{
UINT8 msgType;
UINT8 data1;
UINT8 data2;
UINT16 len;
char data[100];
}PRO_MSG_ALIGN;
#pragma
#define HL_TWK_RED_YEL "\033[1m\033[5;31;43m" //閃爍高亮紅字黃底
#define HL_RED_WRT "\033[1;31;47m" //高亮紅色白底
#define HL_RED "\033[1;31m" //高亮紅色
#define HL_GRN "\033[1;32m" //高亮綠色
#define HL_YEL "\033[1;33m" //高亮黃色
#define HL_DGRN "\033[1;36m" //高亮深綠
#define PF_CLR "\033[0m" //清除
#define myprintf(color, format, args...) \
do{ \
printf(color); \
printf(format, ##args); \
printf(PF_CLR); \
}while(0)
void dump_frm(char *title,UINT8 *data,int len)
{
int i=0;
myprintf(HL_YEL,"%s\n",title);
for(i=0;i<len;i++)
{
if(i==0){
myprintf(HL_RED,"%02x ",data[i]);
}else if(i==3 || i==4){
myprintf(HL_DGRN,"%02x ",data[i]);
}
else{
myprintf(HL_GRN,"%02x ",data[i]);
}
}
putchar('\n');
}
int main(int args, char *argv[])
{
UCHAR frm[]={0x12,0x34,0x56,0x00,0x07,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
dump_frm("frm<<<",frm,sizeof(frm));
#if 0
printf("\033[1;31mThis text is in red and bold.\033[0m\n");
printf("\033[0;31mThis text is in red and not bold.\033[0m\n");
printf("\033[0;36m****一口Linux*****【0;36m】\033[0m\r\n");
printf("\033[1;36m****一口Linux*****【1;36m】\033[0m\r\n");
printf("\033[4;36m****一口Linux*****【4;36m】\033[0m\r\n");
printf("\033[5;36m****一口Linux*****【5;36m】\033[0m\r\n");
printf("\033[7;36m****一口Linux*****【7;36m】\033[0m\r\n");
printf("\033[8;36m****一口Linux*****【8;36m】\033[0m\r\n");
printf("\033[22;36m****一口Linux*****【22;36m】\033[0m\r\n");
printf("\033[24;36m****一口Linux*****【24;36m】\033[0m\r\n");
printf("\033[25;36m****一口Linux*****【25;36m】\033[0m\r\n");
printf("\033[27;36m****一口Linux*****【27;36m】\033[0m\r\n");
printf("\033[30m****一口Linux*****【30】\033[0m\r\n");
printf("\033[31m****一口Linux*****【31】\033[0m\r\n");
printf("\033[32m****一口Linux*****【32】\033[0m\r\n");
printf("\033[33m****一口Linux*****【33】\033[0m\r\n");
printf("\033[34m****一口Linux*****【34】\033[0m\r\n");
printf("\033[35m****一口Linux*****【35】\033[0m\r\n");
printf("\033[36m****一口Linux*****【36】\033[0m\r\n");
printf("\033[37m****一口Linux*****【37】\033[0m\r\n");
printf("\033[40m****一口Linux*****【40】\033[0m\r\n");
printf("\033[41m****一口Linux*****【41】\033[0m\r\n");
printf("\033[42m****一口Linux*****【42】\033[0m\r\n");
printf("\033[43m****一口Linux*****【43】\033[0m\r\n");
printf("\033[44m****一口Linux*****【44】\033[0m\r\n");
printf("\033[45m****一口Linux*****【45】\033[0m\r\n");
printf("\033[46m****一口Linux*****【46】\033[0m\r\n");
printf("\033[47m****一口Linux*****【47】\033[0m\r\n");
#endif
return 0;
}