目录

【ESP_LOG原理】

【menuconfig设置】

【代码示例】

【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博客

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐