最近做了一些Linux應(yīng)用開發(fā)方面的東西,感覺現(xiàn)在有點(diǎn)混亂,所以想將每個(gè)知識(shí)點(diǎn)模塊化,并且能夠搭建自己的API庫(kù),方便以后能夠直接使用!
 哈嘍,伙計(jì)們!
最近做了一些Linux?應(yīng)用開發(fā)方面的東西,感覺現(xiàn)在有點(diǎn)混亂,所以想將每個(gè)知識(shí)點(diǎn)模塊化,并且能夠搭建自己的API庫(kù),方便以后能夠直接使用!
今天主要來討論一下我們最常用的打印字符串,實(shí)現(xiàn)調(diào)試打印和顏色打印。
1、明確需求
在Linux開發(fā)環(huán)境下,我們?nèi)粘J褂玫拇蛴∽址闹饕枨罂赡苡袃煞N:
- 多級(jí)別打?。何覀冋{(diào)試打印信息可以分為多個(gè)級(jí)別,全局設(shè)置打印級(jí)別,來實(shí)現(xiàn)打印的全局管理!
 - 多顏色打?。翰煌拇蛴〖?jí)別對(duì)應(yīng)不同的打印色彩,方便快速吸引開發(fā)者的注意力,快速定位問題!
 
基于以上兩個(gè)基本需求,我們來進(jìn)行簡(jiǎn)單封裝。
2、打印級(jí)別分類
打印級(jí)別參考內(nèi)核的分類,設(shè)置級(jí)別如下:
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、打印級(jí)別控制
打印級(jí)別分類后,我們定義全局變量,來全局控制打印級(jí)別。
GLOBAL_LOG_LEVEL g_log_level = LOG_INFO;        //  default log level
/**
 * @brief 設(shè)置LOG打印等級(jí)
 * 
 * @param log_level 
 */
void Set_Log_Lever(GLOBAL_LOG_LEVEL log_level){
    g_log_level = log_level;
}
如果需要全局調(diào)整打印級(jí)別,我們可以調(diào)用Set_Log_Lever的接口,實(shí)現(xiàn)打印級(jí)別的適時(shí)調(diào)整。
4、打印信息添加
在輸出我們正常打印信息之前,我們也需要添加一些時(shí)間信息,打印級(jí)別信息等。
constchar global_log_level_string[8][10] = {"EMERG", "ALERT", "CRIT", "ERR", "WARNING", "NOTICE", "INFO", "DEBUG"};
    staticchar str_tmp[512];
    // 增加時(shí)間信息
    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, "] ");通過以上代碼,將時(shí)間和打印級(jí)別信息都添加到字符串之前。
輸出效果如下:
[2022-10-2109:13:54 INFO] log info output
 5、顏色定義
顏色控制如何做?
很簡(jiǎn)單,在輸出字符串前,符合特定的顏色控制格式,就可以更改打印顏色了。
printf("\033[顯示方式;字背景顏色;字體顏色m…\033[0m")控制命令以\033[?開頭,以m?結(jié)尾,而中間則是屬性碼,屬性代碼之間使用;?分隔,如\033[1;34;42m?,最后以默認(rèn)顏色\033[0m結(jié)尾,以避免影響后面正常打??!
顯示方式
意義
   | 顯示方式
   | 
默認(rèn)
   | 0
   | 
高亮顯示
   | 1
   | 
下劃線
   | 4
   | 
閃爍
   | 5
   | 
反白顯示
   | 7
   | 
不可見
   | 8
   | 
 前景顏色和背景顏色
顏色
   | 前景色
   | 背景色
   | 
黑色
   | 30
   | 40
   | 
紅色
   | 31
   | 41
   | 
綠色
   | 32
   | 42
   | 
黃色
   | 33
   | 43
   | 
藍(lán)色
   | 34
   | 44
   | 
紫紅色
   | 35
   | 45
   | 
青藍(lán)色
   | 36
   | 46
   | 
白色
   | 37
   | 47
   | 
沒有設(shè)置的話就是默認(rèn)
顏色定義
下方定義一些常用顏色,方便打印調(diào)用。
#define LOG_CLRSTR_NONE         "\033[0m"               // 默認(rèn)顯示
#define LOG_CLRSTR_RED          "\033[0;42;31m"         // 綠紅色
#define LOG_CLRSTR_GREEN        "\033[0;32m"          // 綠色
#define LOG_CLRSTR_BLUE         "\033[0;32;34m"         // 藍(lán)色
#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、顏色控制
定義完各類顏色后,我們要做的就是對(duì)于不同級(jí)別的打印,選擇不同的顏色!
//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、顏色打印
在選擇對(duì)應(yīng)顏色之后,我們要做的就是將這些顏色信息,放到正常打印信息的前方。
可以通過字符串拼接的函數(shù)實(shí)現(xiàn)。
//  重新設(shè)置標(biāo)準(zhǔn)輸出
    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,來恢復(fù)默認(rèn)!
8、打印預(yù)覽
設(shè)置完成之后,我們看一下打印預(yù)覽:

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