ESP32学习笔记——LOG日志库的使用

注:本文由CHATGPT辅助创作,未经验证,实际工程使用请仔细甄别。
对于设置日志级别的几种方式(esp_log_level_set、CONFIG_LOG_DEFAULT_LEVEL、CONFIG_LOG_MAXIMUM_LEVEL、LOG_LOCAL_LEVEL )容易混淆,特此学习并记录。

文章目录

  • 一. 初始化与基础用法
  • 二. 日志级别
  • 三. 日志函数
  • 四. 设置日志级别
    • 1. esp_log_level_set(TAG, level)
    • 2. CONFIG_LOG_DEFAULT_LEVEL
    • 3. LOG_LOCAL_LEVEL
    • CONFIG_LOG_MAXIMUM_LEVEL
    • 三者的优先级和交互关系
  • 五. 日志格式

ESP官网参考链接:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/log.html(日志库)

ESP32的日志库(esp_log.h)提供了一个简单而高效的方式来记录调试信息、错误和其他日志。使用这个库可以方便地将日志信息输出到串口、文件等,有助于开发过程中的调试和性能分析。以下是它的使用方法和一些常见的API。

一. 初始化与基础用法

在FreeRTOS系统中,只需包含头文件即可使用,不需要专门初始化。默认情况下,所有日志会输出到UART。

#include "esp_log.h"

二. 日志级别

ESP32的日志库支持以下几种日志级别,按优先级从高到低排列:

  • ESP_LOG_ERROR:错误信息,严重的问题。
  • ESP_LOG_WARN:警告信息,潜在问题。
  • ESP_LOG_INFO: 一般信息,系统状态或进程说明。
  • ESP_LOG_DEBUG:调试信息,用于开发阶段的详细信息。
  • ESP_LOG_VERBOSE:最详细的信息,一般用于跟踪代码流。

可以使用环境变量或代码设置日志级别控制输出。

三. 日志函数

以下是常见的日志函数,TAG是用来标记日志来源的字符串,可以方便地追踪日志属于哪个模块。

#define TAG "my_module"  // 定义一个TAG用于标记模块名称ESP_LOGE(TAG, "This is an error message: %d", error_code);    // 错误日志
ESP_LOGW(TAG, "This is a warning");                          // 警告日志
ESP_LOGI(TAG, "System is running at %d MHz", cpu_freq);      // 信息日志
ESP_LOGD(TAG, "Variable x = %d", x);                         // 调试日志
ESP_LOGV(TAG, "Entering function foo()");                    // 详细日志

这些宏会根据设置的日志级别进行编译,如果设置为较低的日志级别(例如ESP_LOG_INFO),则不会编译更高详细级别(如DEBUGVERBOSE),从而节省资源。
(见下章)

四. 设置日志级别

在ESP-IDF中,CONFIG_LOG_DEFAULT_LEVEL配置、 LOG_LOCAL_LEVEL宏定义、esp_log_level_set(TAG, level)函数,这三者都可以控制日志的输出级别,但它们的作用范围和应用时机各有不同。以下是这三个方法的详细说明和它们之间的区别:

1. esp_log_level_set(TAG, level)

启用 CONFIG_LOG_DYNAMIC_LEVEL_CONTROL 选项后,则可在运行时通过 esp_log_level_set() 更改日志级别。
动态更改日志级别提高了灵活性,但也会产生额外的代码开销。 如果应用程序不需要动态更改日志级别,并且不需要使用标签来控制每个模块的日志,建议禁用 CONFIG_LOG_DYNAMIC_LEVEL_CONTROL

  • 作用范围:运行时设置特定模块的日志级别。
  • 作用对象:仅针对指定的 TAG(模块)生效。
  • 生效时机:运行时动态控制,可以在代码的不同部分调整同一模块的日志级别。
  • 使用场景:当需要在运行时动态调整某个模块的日志级别时使用,例如调试特定模块而不影响其他模块的日志输出。
esp_log_level_set("my_module", ESP_LOG_WARN);  // 将"my_module"模块的日志级别设置为WARN
esp_log_level_set("*", ESP_LOG_INFO);  // 将所有模块的日志级别设置为INFO

注意,函数 esp_log_level_set() 无法将日志级别设置为高于 CONFIG_LOG_MAXIMUM_LEVEL 指定的级别。如需在编译时将特定文件的日志级别提高到此最高级别以上,请使用 LOG_LOCAL_LEVEL 宏。

2. CONFIG_LOG_DEFAULT_LEVEL

menuconfig 中,使用选项 CONFIG_LOG_DEFAULT_LEVEL 来设置日志级别。配置后,项目中所有模块的默认日志级别将被设置(如 ESP_LOG_WARN),即启用所有级别低于 CONFIG_LOG_DEFAULT_LEVEL 的日志。

  • 作用范围:全局默认日志级别,影响整个项目的日志输出。
  • 作用对象:所有模块的默认日志级别。
  • 生效时机:编译时配置,通过 menuconfig 设置。此选项在项目编译前生效,编译完成后无法动态更改。
  • 使用场景:用于为整个项目设置统一的日志级别,适合在正式发布时限制日志输出。

通过 menuconfig 配置:

idf.py menuconfig
# 进入 "Component config" -> "Log output" -> "Default log verbosity"
# 设置全局默认日志级别,例如设置为 WARN

3. LOG_LOCAL_LEVEL

  • 作用范围:文件级别,影响单个源文件的日志输出。
  • 作用对象:当前源文件中的所有日志宏调用。
  • 生效时机:编译时控制,必须在文件顶部定义;在编译时决定当前文件可输出的日志级别。
  • 使用场景:当某个源文件需要更高或更低的日志级别,而不影响其他文件的日志输出时使用。

在文件顶部定义:

#define LOG_LOCAL_LEVEL ESP_LOG_WARN
#include "esp_log.h"

这样设置后,当前文件中的所有日志输出会限制在 WARN 级别及以上,即使在代码中调用了 ESP_LOGD(),这些低级别日志也不会输出。

CONFIG_LOG_MAXIMUM_LEVEL

可以在 menuconfig 中使用选项 CONFIG_LOG_MAXIMUM_LEVEL 设置最高日志级别。这个选项默认被配置为默认级别,但这个选项也可以被配置为更高级别,将更多的可选日志编译到固件中。

三者的优先级和交互关系

  1. CONFIG_LOG_DEFAULT_LEVEL 是项目的全局默认日志级别,影响所有模块,但它可以被 esp_log_level_setLOG_LOCAL_LEVEL 覆盖。
  2. LOG_LOCAL_LEVEL 的优先级高于CONFIG_LOG_DEFAULT_LEVEL,并且只能影响定义了它的源文件。如果某文件定义了 #define LOG_LOCAL_LEVEL ESP_LOG_WARN,即便全局日志级别为 INFO,该文件仍会限制在 WARN 及以上。

总结

  • 如果想控制单个模块的日志输出,可以在代码中用 esp_log_level_set(TAG, level)
  • 如果希望在编译时控制单个文件的日志级别,可以使用 LOG_LOCAL_LEVEL。
  • 如果需要在项目整体上控制日志级别,使用 CONFIG_LOG_DEFAULT_LEVEL。

五. 日志格式

默认的日志输出格式包括时间戳、日志级别和标签等。输出样例如下:

I (200) my_module: System is running at 160 MHz

其中:

  • I 表示 INFO 级别。
  • (200) 表示时间戳(从系统启动以来的毫秒数)。
  • my_module 是 TAG 标签。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity显示获取 年月日周几【日期】

unity显示获取 年月日周几【日期】 public void ShowDate(Text txt){//txt.text DateTime now DateTime.Now; // 获取当前时间int year now.Year; // 获取年份int month now.Month; // 获取月份(1-12)int day now.Day; // 获取天数(1-31&…

emr上使用sparkrunner运行beam数据流水线

参考资料 https://time.geekbang.org/column/intro/167?tabcatalog Apache Beam和其他开源项目不太一样,它并不是一个数据处理平台,本身也无法对数据进行处理。Beam所提供的是一个统一的编程模型思想,而我们可以通过这个统一出来的接口来编…

AUTOSAR CP SocketAdaptor(SoAd)规范导读

《AUTOSAR_SWS_SocketAdaptor》规范的主要内容包括: 简介和功能概述:说明了 AUTOSAR 基本软件模块 Socket Adaptor(SoAd)的功能、API 和配置。数据传输的 TCP/IP 概念在计算和电信环境中已成为标准,应用程序的寻址等…

代码随想录-栈和队列-用栈实现队列

问题描述 题目描述中有说不存在空栈的pop和peek,所以无需判断这个 解析 重点在于思路,代码白给。 要用栈实现队列,肯定是两个栈才可以。一个做入队操作,一个做出队操作。 首先入队简单,往栈里加就完事了。 出队复…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列,共包含以下文章: 结构型模式(一):适配器模式、装饰器模式结构型模式(二):代理模式结构型模式(三):桥接模式、外观…

轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记

官网:民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明:一是法规部分;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网:民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…

【leetcode练习·二叉树】用「分解问题」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 I | labuladong 的算法笔记] 105. 从前序与中序遍历序列构造二叉树 | 力扣 | LeetCode | 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵…

深入解析四种核心网络设备:集线器、桥接器、路由器和交换机

计算机网络系列课程《网络核心设备》 在现代网络技术中,集线器、桥接器、路由器和交换机扮演着至关重要的角色。本文,将深入探讨这四种设备的功能、工作原理及其在网络架构中的重要性。 集线器:基础网络连接设备 集线器(Hub&…

宏景eHR uploadLogo.do 任意文件上传致RCE漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款专为复杂单组织或多组织客户设计的人力资源管理软件,融合了最新的互联网技术和先进的人力资源管理理念和实践。宏景eHR软件支持B/S架构,特别适合集团化管理和跨地域使用。它提供了全面的人力资源管理功能,包括人员、组织机构、…

ssm基于JAVA的网上订餐管理系统+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

NVR设备ONVIF接入平台EasyCVR私有化部署视频平台如何安装欧拉OpenEuler 20.3 MySQL

在当今数字化时代,安防视频监控系统已成为保障公共安全和个人财产安全的重要工具。NVR设备ONVIF接入平台EasyCVR作为一款功能强大的智能视频监控管理平台,它不仅提供了视频远程监控、录像、存储与回放等基础功能,还涵盖了视频转码、视频快照、…

测试网空投进行中 — 全面了解 DePIN 赛道潜力项目 ICN Protocol 及其不可错过的早期红利

随着云计算技术的飞速发展,越来越多的企业和个人对云服务的需求变得多样化且复杂化。然而,传统的中心化云服务平台(如AWS、微软Azure等)往往存在着高成本、数据隐私保护不足以及灵活性差等问题。 为了解决这些挑战,Imp…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04,为了提升大型语言模型在不同文化背景下的实用性,华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题,覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…

CAD VBA 图元颜色跟随图层

效果如下: 一、所有图元颜色为bylayer Sub 图元颜色跟随图层() Dim item As AcadEntityFor Each item In ThisDrawing.ModelSpace item.color acByLayer Next ThisDrawing.Regen acActiveViewport End Sub二、与图层颜色相同(不是bylayer):…

介绍一下数组(c基础)(smart 版)

c初期,记住规则,用规则。 我只是介绍规则。(有详细版,这适合smart人看) 数组(同类型) int arr[n] {} ; int 是 元素类型。 int arr[n] {} ; arr为标识符。 {} 集合,元素有次…

【数据结构】插入排序——直接插入排序 和 希尔排序

直接插入排序 和 希尔排序 一、直接插入排序二、直接插入排序的弊端三、希尔排序(1)对插入排序的联想(2)希尔排序的思路 四、直接插入排序和希尔排序效率对比1>随机生成10000个数2>我们随机生成100000个数3>我们随机生成…

python使用turtle画图快速入门,轻松完成作业练习

turtle介绍 turtle是一个绘图库,可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程,当然,也可以使用其进行作图。 在一些学校中,可能在python学习的课程中,要求完成turtle绘…

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点 而Taint 则相反,它使节点能够排斥一类特…

分布式唯一ID生成(二): leaf

文章目录 本系列前言号段模式双buffer优化biz优化动态step源码走读 雪花算法怎么设置workerId解决时钟回拨源码走读 总结 本系列 漫谈分布式唯一ID分布式唯一ID生成(二):leaf(本文)分布式唯一ID生成(三&am…

MVDR:最小方差无失真响应技术解析

目录 什么是MVDR?MVDR的工作原理主要步骤MVDR的应用场景MVDR的优势与挑战结论 什么是MVDR? MVDR(Minimum Variance Distortionless Response,最小方差无失真响应)是一种用于信号处理中的自适应滤波技术,广…