不會吧,你還在赤裸裸的使用printf?

嵌入式linux 發佈 2022-10-29T21:27:55.271791+00:00

不會吧,你還在赤裸裸的使用printf?哈嘍,夥計們!最近做了一些Linux應用開發方面的東西,感覺現在有點混亂,所以想將每個知識點模塊化,並且能夠搭建自己的API庫,方便以後能夠直接使用!今天主要來討論一下我們最常用的列印字符串,實現調試列印和顏色列印。

不會吧,你還在赤裸裸的使用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?

版權申明:本文來源於網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。

關鍵字: