ESP32 Logging库

翻译自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

posted @ 2018-10-07 12:21  江米条  阅读(3676)  评论(0编辑  收藏  举报