翻譯自https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-reference/system/log.html?highlight=esp_log_level_set
概述
日志庫有兩種管理日志詳細程度的方法:編譯階段,通過菜單設置;運行階段,使用esp_log_level_set()函數設置。
日志等級有:錯誤,警告,信息,調試和詳細(詳細度從最低到最高)。
在編譯階段,使用CONFIG_LOG_DEFAULT_LEVEL選項過濾。所有等級狀態高於CONFIG_LOG_DEFAULT_LEVELD的日志將會被處理器移除。
在運行階段,所有低於CONFIG_LOG_DEFAULT_LEVEL的日志被默認使能。esp_log_level_set()函數可以用來減少每個模塊的日志等級。模塊通過標簽識別,這些標簽是可讀的零結尾的ASCII字符串。
注意esp_log_level_set()函數不能提高到超過CONFIG_LOG_DEFAULT_LEVEL設置的等級。在編譯階段,為了給特殊文件提高日志等級,可以使用LOG_LOCAL_LEVEL宏(詳見下)。
如何使用庫
在每個C文件里使用日志功能,需要這樣定義TAG變量:
static const char* TAG = "MyModule";
然后農戶使用一條日志宏來產生輸出,比如:
ESP_LOGW(TAG, "Baud rate error %.1f%%. Requestd: %d baud, actual: %d", error * 100, baud_req, baud_real);
以下是一些不同復雜度的日志宏:
. ESP_LOGE - error(lowest)
. ESP_LOGW - warning
. ESP_LOGI -info
. ESP_LOGD -debug
. ESP_LOGV -verbose(highest)
另外有一個_EARLY變量對應以上每一個宏(比如ESP_EARLY_LOGE)。這些變量可以在啟動代碼中運行,在堆棧分配和系統調用被初始化前。當編譯引導程序時,普通的ESP_LOGx宏不像ESP_EARLY_LOGx那么有效。所以ESP_EARLY_LOGx明確的唯一用處是在啟動代碼里,比如堆棧分配初始化代碼。
為了覆蓋一個文件或部件作用范圍的默認詳細度,定義LOG_LOCAL_LEVEL宏。在文件作用范圍,在 inclueing esp_log.h 前定義它,比如:
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE #include "esp_log.h"
在部件范圍,在部件的makefile里定義:
CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG
在運行階段,為了配置每個模塊的日志輸出,增加條用 esp_log_level_set() 函數:
esp_log_level_set("*", ESP_LOG_ERROR); // 設置所有的部件日志詳細度為ERROR esp_log_level_set("wifi", ESP_LOG_WARN); // 使能來自WiFi棧的警告日志 esp_log_level_set("dhcpc", ESP_LOG_INFO); // 使能來自DHCP客戶端的信息日志
通過JTAG登錄主機
日志庫默認使用像vprintf這樣的函數來寫格式化輸出到專用串口。通過調用簡單的API,所有的日志輸出可以被路由到JTAG來代替,使日志服務時間更快。詳細內容請參考 Logging to Host 章節。
應用舉例
日志庫被絕大部分esp-idf部件和例程使用。為了演示日志功能,檢查 espressif/esp-idf 倉庫examples 文件夾,其中包括以下例子:
. system/ota
. storage/sd_card
. protocols/https_request