目录
【ESP_LOG原理】
【代码示例】
【ESP_LOG相比printf的优势】
【ESP_LOG原理】
日志级别 | 函数 | 简要说明 | 颜色 |
---|---|---|---|
Verbose | ESP_LOGV(tag, format, ...) | 详细的调试信息,通常用于跟踪程序执行流程。 | 默认 |
Debug | ESP_LOGD(tag, format, ...) | 调试信息,用于开发阶段的调试。 | 白色 |
Info | ESP_LOGI(tag, format, ...) | 一般信息,用于记录程序的运行状态。 | 绿色 |
Warning | ESP_LOGW(tag, format, ...) | 警告信息,表示可能存在问题,但不会影响程序运行。 | 黄色 |
Error | ESP_LOGE(tag, format, ...) | 错误信息,表示程序出现了需要处理的问题。 | 红色 |
日志级别:从低到高为Verbose、Debug、Info、Warning、Error。低于设置级别的日志不输出。日志函数: 每个日志函数都需要一个 tag 参数,用于标识日志的来源。
日志颜色: 不同级别的日志在终端中会以不同的颜色显示,便于快速区分日志的重要性。
【menuconfig设置】
1. Default log verbosity
KCONFIG Name: LOG_DEFAULT_LEVEL
作用:
设置默认的日志输出级别。 低于该级别的日志在编译时会被忽略
例如,若设置为 Warning,则运行时不会输出 Debug 或更低级别的日志。
注意事项: 如果需要运行时调整日志级别到比默认级别更高的级别,请参考下一项配置。
2. Maximum log verbosity
KCONFIG Name: LOG_MAXIMUM_LEVEL
作用: 设置运行时可以通过 esp_log_level_set 调整的最高日志级别(可高于默认日志级别)
例如,默认日志级别为 Info,但最大日志级别可以设置为 Debug,这样在运行时可以动态调整到 Debug 级别。
用途: 在关键点启用调试输出。 启动时减少日志输出,启动完成后再启用更多日志。
注意事项: 增加最大日志级别会增加固件的大小。
该配置仅适用于应用程序的日志,Bootloader 的日志级别在编译时固定。
3. Enable global master log level
KCONFIG Name: LOG_MASTER_LEVEL
作用: 启用全局主日志级别检查。 在主日志级别检查之后,才会进行日志标签的缓存查找。 主日志级别默认为 LOG_DEFAULT_LEVEL,可通过 esp_log_set_level_master 动态调整。
用途: 当需要编译大量日志但希望在特定时间段禁用日志输出时,可以避免性能开销。
例如,在时间关键或 CPU 密集的任务期间禁用日志,任务完成后再重新启用。
注意事项: 启用该选项会增加程序的大小,具体取决于编译的日志数量。
主日志级别检查优先于本地日志级别(ESP_LOG_LEVEL_LOCAL)。
4. Use ANSI terminal colors in log output
KCONFIG Name: LOG_COLORS
作用: 在日志输出中启用 ANSI 终端颜色代码。 不同日志级别会以不同颜色显示(如 Error 为红色,Warning 为黄色等)。
注意事项: 终端程序必须支持 ANSI 颜色代码才能显示颜色。
5. Log Timestamps
KCONFIG Name: LOG_TIMESTAMP_SOURCE
作用: 设置日志输出中的时间戳来源。
选项: Milliseconds since boot: 从启动开始的毫秒数,基于 RTOS 的 tick 计数和 tick 周期计算。 软件重启后会重置。 示例:(90000)。
System time: 从 POSIX 时间函数获取,使用芯片的 RTC 和高精度计时器维护。 系统时间在启动时初始化为 0,可通过 SNTP 同步或 POSIX 时间函数设置。 软件重启后不会重置
示例:(00:01:30.000)。
注意事项:目前该配置不适用于二进制库(如 Wi-Fi 和 Bluetooth 库)的日志输出,这些库的日志始终使用“从启动开始的毫秒数”。
【代码示例】
#include "esp_log.h"static const char *TAG = "MyModule";void app_main() {ESP_LOGE(TAG, "This is an error log."); // 红色ESP_LOGW(TAG, "This is a warning log."); // 黄色ESP_LOGI(TAG, "This is an info log."); // 绿色ESP_LOGD(TAG, "This is a debug log."); // 白色ESP_LOGV(TAG, "This is a verbose log."); // 默认颜色
}
【ESP_LOG相比printf的优势】
特性 | ESP_LOG | printf |
---|---|---|
日志级别 | 支持多级别日志(Verbose、Debug、Info、Warning、Error),便于过滤和分类日志。 | 无日志级别,所有输出均为普通信息 |
颜色区分 | 不同级别的日志可以显示不同的颜色(需启用 LOG_COLORS ),便于快速识别。 | 无颜色区分,所有输出均为单一颜色 |
标签支持 | 每条日志可以附加标签(tag),便于区分不同模块或功能的日志。 | 无标签支持,所有输出均为无标识的普通信息 |
性能优化 | 针对嵌入式系统优化,减少资源占用。 | 无专门优化,可能占用较多资源(如内存和 CPU) |
运行时过滤 | 支持通过 esp_log_level_set 动态调整日志级别,控制日志输出。 | 无运行时过滤功能,所有输出均显示 |
编译时优化 | 低级别日志(如 Debug 和 Verbose)可以在编译时被忽略,减少固件大小。 | 所有输出均会被编译到固件中,无法在编译时优化 |
时间戳支持 | 支持自动添加时间戳,便于跟踪日志的时间顺序。 | 需手动添加时间戳,增加代码复杂性 |
跨平台兼容性 | 专为 ESP32 系列芯片设计,与 ESP-IDF 框架深度集成。 | 通用性强,但不针对特定平台优化 |
线程安全性 | 在多线程环境中是安全的。 | 需要手动实现线程安全机制 |
日志输出目标 | 支持多种输出目标(如 UART、文件、网络等)。 | 通常仅支持 UART 或标准输出 |
参考:
ESP32学习笔记——LOG日志库的使用_esp32 log-CSDN博客
ESP_LOG_esplog-CSDN博客