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
),则不会编译更高详细级别(如DEBUG
或VERBOSE
),从而节省资源。
(见下章)
四. 设置日志级别
在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
设置最高日志级别。这个选项默认被配置为默认级别,但这个选项也可以被配置为更高级别,将更多的可选日志编译到固件中。
三者的优先级和交互关系
CONFIG_LOG_DEFAULT_LEVEL
是项目的全局默认日志级别,影响所有模块,但它可以被esp_log_level_set
和LOG_LOCAL_LEVEL
覆盖。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 标签。
相关文章:
ESP32学习笔记——LOG日志库的使用
注:本文由CHATGPT辅助创作,未经验证,实际工程使用请仔细甄别。 对于设置日志级别的几种方式(esp_log_level_set、CONFIG_LOG_DEFAULT_LEVEL、CONFIG_LOG_MAXIMUM_LEVEL、LOG_LOCAL_LEVEL )容易混淆,特此学习…...

51c~C语言~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12428240 一、C语言和C的区别 C语言虽说经常和C在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C是C99标准的。C89就是在1989年制定的标准,如今最新…...
$nextTick 实现原理
Vue 使用 nextTick 来确保数据更新后的 DOM 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中,确保回调在 DOM 更新完成后执行。 Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行,通常是通过: Promise&#x…...

kelp protocol
道阻且长,行而不辍,未来可期 有很长一段时间我都在互联网到处拾金,but,东拼西凑的,总感觉不踏实,最近在老老实实的看官方文档 & 阅读白皮书 &看合约,挑拣一些重要的部分配上官方的证据,和过路公主or王子分享一下,愿我们早日追赶上公司里那些可望不可及大佬们。…...

Golang--面向对象
Golang语言面向对象编程说明: Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),Go语言的结构体(struct)和其…...

深度学习经典模型之LeNet-5
1 LeNet-5 1.1 模型介绍 LeNet-5是由 L e C u n LeCun LeCun 提出的一种用于识别手写数字和机器印刷字符的卷积神经网络(Convolutional Neural Network,CNN) [ 1 ] ^{[1]} [1],其命名来源于作者 L e C u n LeCun LeCun的名字…...

Abaqus随机骨料过渡区孔隙三维网格插件:Random Agg ITZ Pore 3D (Mesh)
插件介绍 Random Agg ITZ Pore 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus内参数化建立包含水泥浆基体、粗细骨料、界面过渡区(ITZ)、孔隙在内的多相材料混凝土细观背景网格模型。 模型说明 插件采用材料映射单元的方式,将不同相材料赋值…...

PG数据库 jsonb字段 模糊查询
背景: 项目由于多语言的设计,将字段设置成json字段类型,同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构:name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…...

javascript-Web APLs (四)
日期对象 用来表示时间的对象 作用:可以得到当前系统时间 在代码中发现了 new 关键字时,一般将这个操作称为 实例化 //创建一个时间对象并获取时间 //获得当前时间 const date new Date() //获得指定时间 const date new Date(2006-6-6) console.log(…...
Keras 3 示例:开启深度学习之旅
Keras 3 示例:开启深度学习之旅 一、Keras 3 简介 Keras 3是一个强大的深度学习框架,它为开发者提供了简洁、高效的方式来构建和训练神经网络。它在之前版本的基础上进行了改进和优化,具有更好的性能、兼容性和功能扩展性。无论是初学者还是…...

鸿蒙Next如何接入微信支付
大家好,这是我工作中接触到的鸿蒙Next接入微信支付,有使用到,分享给大家,轻松便捷 前提:你已有鸿蒙版本的微信,并且微信余额或绑定银行卡有钱,因为内测的微信暂不支持收红包和转账,2.你的应用已…...

nginx(五):关于location匹配规则那些事
关于location匹配规则那些事 1 概述2 语法3 匹配规则说明3.1 精确匹配3.2 前缀匹配(^~)3.3 正则表达式匹配(\~和\~*)3.4 普通前缀匹配 4 匹配优先级5 注意事项6 总结 大家好,我是欧阳方超,可以我的公众号“…...

【论文阅读】Associative Alignment for Few-shot Image Classification
用于小样本图像分类的关联对齐 引用:Afrasiyabi A, Lalonde J F, Gagn C. Associative alignment for few-shot image classification[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part V 16. Spri…...

acmessl.cn提供接口API方式申请免费ssl证书
目录 一、前沿 二、API接口文档 1、证书可申请列表 简要描述 请求URL 请求方式 返回参数说明 备注 2、证书申请 简要描述 请求URL 请求方式 业务参数 返回示例 返回参数说明 备注 3、证书查询 简要描述 请求URL 请求方式 业务参数 返回参数说明 备注 4、证…...

DBeaver如何快速格式化sql语句,真简单!
前言 我之前在使用DBeaver的时候,一直不知道其可以格式化sql语句,导致sql语句看起来比较杂乱,今天就来介绍下DBeaver如何格式化sql语句。 如何格式化sql语句 首先,我们打开一个sql窗口,在里面输入我们要查询的sql语…...
OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)
目录 一、定义与背景 二、计算流程 三、性质与特点 四、应用场景 五、代码实现 多尺度结构相似性(MSSIM)是一种用于衡量两幅图像之间相似度的指标,它基于结构相似性(SSIM)指数进行扩展,通过在不同尺度上计算SSIM来评估图像的整体质量。以下是对MSSIM的详细介…...
代码随想录第二十二天
回溯算法理论介绍 回溯算法是一种基于递归思想的算法设计技术,适用于解决需要构造所有解或找到特定解的组合问题。回溯的基本思路是通过系统地搜索所有可能的解决方案,然后逐步撤销不符合要求的选择,回到上一步继续尝试。这种算法最适合应用…...
【k8s】ClusterIP能http访问,但是不能ping 的原因
ClusterIP 服务在 Kubernetes 中是可以访问的,但通常无法通过 ping 命令来测试连通性。这主要是因为 ClusterIP 是一个虚拟 IP 地址,而不是实际分配给某个网络接口的 IP 地址。以下是一些原因和解释: 1. 虚拟 IP 地址 ClusterIP 是一个虚拟…...

【力扣打卡系列】单调栈
坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的…...

使用docker安装zlmediakit服务(zlm)
zlmediakit安装 zlmediakit安装需要依赖环境和系统配置,所以采用docker的方式来安装不容易出错。 docker pull拉取镜像(最新) docker pull zlmediakit/zlmediakit:master然后先运行起来 sudo docker run -d -p 1935:1935 -p 80:80 -p 8554:554 -p 10000:10000 -p …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...

开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 ultralytics-models-sam 1.sam-modules-tiny_encoder.py2.数据处理流程3.代码架构图(类层次与依赖)blocks.py: 定义模型中的各种模块结构 ,如卷积块、残差块等基础构建…...
JSON解析崩溃原因及解决方案
问题记录: /************************************************| * 描述: 将ID124执行NFC操作-JSON解析为结构体* 函数名: cJSON_ID124_to_struct* 参数[ I]: *json_string 待解析的指针* 参数[II]: *wireless_rxd 结构体指针* 返回: 成功返回0 失…...