跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

Easylogger 开源日志库配置解析与 STM32 移植指南

综述由AI生成轻量级嵌入式日志库 Easylogger 的核心配置项,包括输出开关、级别控制、缓冲区大小及异步模式等。详细解析了颜色配置、格式附加信息及异步/缓冲输出逻辑。同时提供了基于 STM32 CubeMX 的移植步骤,涵盖串口初始化、源码集成、端口函数重写及调试验证,帮助开发者在资源受限环境下实现高效日志管理。

暖阳发布于 2026/3/23更新于 2026/5/299K 浏览

一、Easylogger 的相关文件解析

这些代码是 Easylogger(一款轻量级嵌入式日志库)的核心配置项(位于 elog_cfg.h 中),用于控制日志库的功能开关、输出级别、缓冲区大小等关键特性。下面逐一解释每个配置的作用:

1. 日志输出总开关
#define ELOG_OUTPUT_ENABLE
  • 作用:定义此宏时,日志库会开启输出功能(日志能正常打印);如果注释掉(// #define ELOG_OUTPUT_ENABLE),所有日志输出会被禁用(节省资源,适合发布版本)。
  • 场景:调试阶段保留,正式发布时可注释以关闭所有日志。
2. 静态日志输出级别
#define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE
  • 作用:设置全局日志输出的最低级别,只有级别大于等于此值的日志才会被打印。
  • 日志级别范围(从低到高,优先级递增):
    • ELOG_LVL_ASSERT:断言错误(最高优先级,通常用于致命错误)
    • ELOG_LVL_ERROR:错误(如功能失败)
    • ELOG_LVL_WARN:警告(如不影响运行但需注意的情况)
    • ELOG_LVL_INFO:信息(如正常流程节点)
    • ELOG_LVL_DEBUG:调试(如变量值、函数调用)
    • ELOG_LVL_VERBOSE:详细信息(最冗余,如每步操作的细节)
  • 示例:若设为 ELOG_LVL_INFO,则 INFO、WARN、ERROR、ASSERT 级别的日志会输出,DEBUG 和 VERBOSE 会被过滤。
3. 断言检查开关
#define ELOG_ASSERT_ENABLE
  • 作用:定义此宏时,日志库会启用 elog_assert() 断言功能(类似 C 标准库的 assert()),当断言条件不满足时,会打印断言日志并触发错误处理(如程序终止)。
  • 场景:调试阶段用于检查关键条件(如指针不为空、参数合法),发布版本可注释以关闭断言(减少资源消耗)。
4. 单条日志的缓冲区大小
#define ELOG_LINE_BUF_SIZE 1024
  • 作用:设置每条日志在内存中临时存储的缓冲区大小(单位:字节)。
  • 注意:
    • 若单条日志内容过长(超过此值),会被截断(只保留前 1024 字节)。
    • 数值越大,单条日志可容纳的内容越多,但会消耗更多 RAM(嵌入式系统需权衡)
5. 行号输出的最大长度
#define ELOG_LINE_NUM_MAX_LEN 5
  • 作用:限制日志中输出的'代码行号'的最大字符长度(默认 5 位)。
  • 示例:若代码行号是 12345,会完整输出;若行号是 123456(6 位),会被截断为 23456(只保留最后 5 位)。
  • 目的:控制日志格式的整齐性,避免行号过长导致日志排版混乱。
6. 过滤标签的最大长度
#define ELOG_FILTER_TAG_MAX_LEN 30
  • 作用:Easylogger 支持按'标签(tag)'过滤日志(如 elog_i("uart", "recv data") 中的 "uart" 是标签),此配置限制标签的最大字符长度(30 字节)。
  • 注意:超过长度的标签会被截断,确保过滤功能正常工作。
7. 过滤关键字的最大长度
#define ELOG_FILTER_KW_MAX_LEN 16
  • 作用:支持按'关键字(keyword)'过滤日志(如只输出包含 "error" 的日志),此配置限制关键字的最大长度(16 字节)。
8. 标签级别过滤的最大数量
#define ELOG_FILTER_TAG_LVL_MAX_NUM 5
  • 作用:Easylogger 支持为不同标签设置独立的日志级别(如 uart 标签只输出 ERROR 及以上,i2c 标签输出 DEBUG 及以上),此配置限制这种'标签 - 级别'映射的最大数量(最多 5 组)。
  • 场景:当需要对多个模块(标签)设置不同日志级别时,若超过 5 组,需增大此值。
9. 换行符定义
#define ELOG_NEWLINE_SIGN "\n"
  • 作用:定义日志结尾的换行符号。
  • 说明:
    • 大多数系统用 "\n"(换行);
    • 部分 Windows 环境可能需要 "\r\n"(回车 + 换行),可在此修改。
总结

这些配置项是 Easylogger 的'总开关'和'参数调节器',核心作用是:

  • 控制日志是否输出、输出哪些级别的日志(ELOG_OUTPUT_ENABLE、ELOG_OUTPUT_LVL);
  • 平衡日志功能和资源消耗(ELOG_LINE_BUF_SIZE、ELOG_ASSERT_ENABLE);
  • 适配不同场景的日志格式和过滤需求(标签长度、换行符等)。

实际使用时,可根据嵌入式系统的 RAM/ROM 资源、调试需求灵活调整(例如:调试阶段开全量日志,发布阶段关闭输出或只保留错误级别)。

还有一些 Easylogger 库中与日志样式、输出格式、异步 / 缓冲模式相关的高级设置

1. 日志颜色配置(终端彩色输出)
#define ELOG_COLOR_ENABLE
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
#define ELOG_COLOR_ERROR (F_RED B_NULL S_NORMAL)
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
#define ELOG_COLOR_VERBOSE (F_BLUE B_NULL S_NORMAL)
  • ELOG_COLOR_ENABLE:开启日志彩色输出(仅在支持 ANSI 颜色码的终端有效,如 Linux 终端、VS Code 终端等)。注释此宏则关闭彩色,所有日志为默认颜色。
  • 颜色宏的含义(以 F_MAGENTA B_NULL S_NORMAL 为例):
    • F_XXX:前景色(文字颜色),如 F_RED(红色)、F_GREEN(绿色)。
    • B_XXX:背景色,B_NULL 表示无背景色(默认)。
    • S_XXX:文字样式,S_NORMAL 表示正常,S_BOLD 表示加粗(部分库支持)。
  • 作用:通过颜色区分不同级别日志,直观识别重要信息(如错误用红色,警告用黄色)。
2. 日志格式配置(附加信息开关)
#define ELOG_FMT_USING_FUNC
#define ELOG_FMT_USING_DIR
#define ELOG_FMT_USING_LINE

这些宏控制日志中是否包含额外调试信息,默认会拼接在日志内容前,格式类似:[时间] [级别] [标签] [文件路径:行号@函数名] 日志内容

  • ELOG_FMT_USING_FUNC:启用则输出函数名(如 main@),方便定位日志所在函数。
  • ELOG_FMT_USING_DIR:启用则输出文件路径(如 src/main.c),方便定位日志所在文件。
  • ELOG_FMT_USING_LINE:启用则输出代码行号(如 123),配合文件路径快速找到代码位置。
  • 使用建议:调试阶段全开启,发布阶段可注释(减少日志长度,节省带宽 / 存储)。
3. 异步输出模式配置(非阻塞日志)
#define ELOG_ASYNC_OUTPUT_ENABLE
#define ELOG_ASYNC_OUTPUT_LVL ELOG_LVL_ASSERT
#define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
#define ELOG_ASYNC_LINE_OUTPUT
#define ELOG_ASYNC_OUTPUT_USING_PTHREAD
  • ELOG_ASYNC_OUTPUT_ENABLE:开启异步输出模式。此时日志不会立即打印,而是先存入缓冲区,由后台线程异步处理(避免日志打印阻塞主程序)。
详细解析一下异步输出的处理逻辑:

'后台线程异步处理'是一种让日志打印不干扰主程序运行的技术,核心是让日志输出工作在'后台'偷偷完成,主程序不用等待它结束。

在 Easylogger 中,'后台线程异步处理'的具体流程是:

  1. 主程序写入日志:当你调用 elog_i("tag", "hello") 输出日志时,日志不会直接发送到串口 / 终端,而是快速存入一块内存缓冲区(类似'快递箱'),主程序写完就立刻返回,继续执行下一行代码(几乎不耽误时间)。
  2. 后台线程独立工作:日志库会创建一个专门的'后台线程',这个线程独立于主程序运行,它的唯一任务是:
    1. 定期检查缓冲区是否有新日志;
    2. 如果有,就把日志从缓冲区取出来,发送到实际的输出设备(如串口、文件、上位机);
    3. 处理完后,继续等待下一批日志。
  3. 两者互不干扰:主程序写日志时,不用等待日志实际输出完成;后台线程输出日志时,也不会影响主程序的正常运行(比如不会打断传感器采集、电机控制等关键任务)。

注意:后台线程需要系统支持多线程(如 RT-Thread、FreeRTOS、Linux pthread),如果是纯裸机系统(无操作系统),则无法使用异步模式,只能用缓冲模式。

  • ELOG_ASYNC_OUTPUT_LVL:设置异步输出的最高级别。例如设为 ELOG_LVL_ASSERT 时:
    • ASSERT 级别日志异步输出(存入缓冲区,后台处理);
    • 比 ASSERT 级别低的日志(如 ERROR、WARN 等)同步输出(立即打印)。
    • (级别优先级:ASSERT > ERROR > WARN > ... > VERBOSE)
  • ELOG_ASYNC_OUTPUT_BUF_SIZE:异步缓冲区大小(默认 10 倍单行缓冲区),用于暂存异步日志。若日志产生过快填满缓冲区,新日志可能被丢弃(需根据系统吞吐量调整)。
  • ELOG_ASYNC_LINE_OUTPUT:强制异步日志必须以换行符结尾,确保后台线程按行解析输出(避免日志内容错乱)。
  • ELOG_ASYNC_OUTPUT_USING_PTHREAD:指定异步模式使用 POSIX 线程库(pthread)实现后台线程(适用于 Linux、RT-Thread 等支持 pthread 的系统)。
4. 缓冲输出模式配置(批量打印)
#define ELOG_BUF_OUTPUT_ENABLE
#define ELOG_BUF_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
  • ELOG_BUF_OUTPUT_ENABLE:开启缓冲输出模式。日志会先存入缓冲区,当缓冲区满或手动触发时,批量输出到目标设备(如串口、文件)。
  • ELOG_BUF_OUTPUT_BUF_SIZE:缓冲区大小(默认 10 倍单行缓冲区),用于暂存待批量输出的日志。
  • 与异步模式的区别:
    • 缓冲模式:无后台线程,由主程序在合适时机(如缓冲区满)主动批量输出,仍可能阻塞但次数减少。
    • 异步模式:由后台线程处理输出,主程序完全非阻塞(但依赖线程支持)。
  • 适用场景:资源受限的嵌入式系统(无线程支持时),通过批量输出减少 IO 操作次数(如串口打印较耗时,批量输出更高效)。

二、移植 Easylogger

1. 使用 CubeMX 配置一个初始化串口的工程(此处以串口为例)

首先选择好对应的芯片型号,然后配置 sys: 使用晶振做时钟源: 配置串口,默认配置就行: 时钟树配置,频率最大即可: 生成 .c 和 .h 文件: 最后直接生成工程。

2. 移植代码

新建一个 Middlewares 的文件夹,将 easylogger 的源码复制进去。 添加组以及相关文件: 添加头文件路径。 此时有一个报错,注释这两个宏定义即可。 对串口进行重定义(记得开启微库),并对 elog_port.c 进行重写: %s:表示输出字符串。 .*:是一个特殊的长度控制符,用于指定字符串的输出长度。其中 * 会从后续参数中获取长度值(这里就是 size)。 例如:如果 log 是 "hello",size 是 3,则 printf("%.*s", 3, "hello") 会输出 hel(只取前 3 个字符)。

3. 添加调试函数

会发现没有换行,调整一下。 输出 TAG,这个标签可以进行自定义,#define TAG "MAIN" 这个标签是字符格式。 log_XX 这个函数不能打印自定义标签,这个函数默认打印的是 NO_TAG。 要使用 elog_xx 函数。

4. 最终效果

运行后可见日志输出正常。

目录

  1. 一、Easylogger 的相关文件解析
  2. 1. 日志输出总开关
  3. 2. 静态日志输出级别
  4. 3. 断言检查开关
  5. 4. 单条日志的缓冲区大小
  6. 5. 行号输出的最大长度
  7. 6. 过滤标签的最大长度
  8. 7. 过滤关键字的最大长度
  9. 8. 标签级别过滤的最大数量
  10. 9. 换行符定义
  11. 总结
  12. 1. 日志颜色配置(终端彩色输出)
  13. 2. 日志格式配置(附加信息开关)
  14. 3. 异步输出模式配置(非阻塞日志)
  15. 详细解析一下异步输出的处理逻辑:
  16. 4. 缓冲输出模式配置(批量打印)
  17. 二、移植 Easylogger
  18. 1. 使用 CubeMX 配置一个初始化串口的工程(此处以串口为例)
  19. 2. 移植代码
  20. 3. 添加调试函数
  21. 4. 最终效果
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 网络安全基础入门教程与学习路线规划
  • Linux 环境下 C/C++ 编译流程与链接机制详解
  • Java API 详解:基础爬虫构建、条件数据提取与正则策略
  • OpenClaw 部署指南:安装、QQ 接入、运维与故障排查
  • Drupal 7 核心模块与常用扩展功能梳理
  • OpenClaw 部署与飞书机器人接入实战指南
  • OpenClaw 浏览器控制方案:让 AI 助手随时控制浏览器
  • 基于 Netty 构建高性能 HTTP 服务器实战
  • Qwen3 核心架构改进与后训练 Pipeline 解析
  • 缓存算法实战:LRU 与 LFU 的 Java 实现与原理解析
  • PyTorch-CUDA 环境下 Stable Diffusion 推理速度分析
  • Trae、Cursor、Copilot、Windsurf 四款 AI 编程工具对比
  • Python 3.14.2 安装与使用指南
  • 医疗 AI 场景下算法编程深度解析(一)
  • C++ 多线程同步实战:条件变量(condition_variable)
  • 图论入门:基本概念与代码实现(邻接矩阵、邻接表、DFS/BFS)
  • PromptPilot 重构 AI 创作逻辑:企业级支撑与创意角色扮演实战
  • HarmonyOS Next DevEco Studio 开发云对象指南
  • 龙虾机器人(OpenClaw)本地部署技术指南
  • Windows 11 环境下 Python 3.12.5 安装与配置指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online