C 语言工业级通用组件手写 25:简易日志系统
目录前言一、核心本质与应用场景1. 什么是简易日志系统2. 解决的核心痛点3. 典型落地场景二、核心实现原理三、工业级设计规范四、完整可复用源码easy_log.h五、实战演示六、进阶优化方向七、面试考点与易错坑点面试问答常见坑点总结前言嵌入式项目开发中调试日志是定位问题的核心手段但上线后又需要关闭打印以节省资源、提高运行效率。一个可配置、带日志级别、支持全局开关的简易日志组件能大幅提升开发效率同时兼顾调试便利性与产品发布性能是工程化项目的标配基础组件。一、核心本质与应用场景1. 什么是简易日志系统对标准 printf 进行封装提供日志分级错误、警告、信息、调试全局开关一键开启 / 关闭所有日志统一输出格式发布版可直接裁剪不占用资源2. 解决的核心痛点调试时到处是 printf删改麻烦上线后忘记关打印占用串口 / CPU日志杂乱无级别难以筛选关键信息多模块日志无法统一管理3. 典型落地场景嵌入式设备调试日志上位机工具状态输出服务器 / Linux 应用简易日志量产设备问题回溯记录二、核心实现原理宏定义控制日志总开关分级宏定义控制不同级别输出统一封装打印接口发布版本直接禁用编译后不产生代码三、工业级设计规范无全局变量不占用 RAM纯宏实现零运行时开销支持多级日志灵活开关兼容标准 C 格式字符串四、完整可复用源码easy_log.h#ifndef EASY_LOG_H #define EASY_LOG_H #include stdio.h // 总日志开关 0-关闭 1-开启 #define ELOG_ENABLE 1 // 日志级别定义 #define ELOG_LEVEL_DEBUG 0 #define ELOG_LEVEL_INFO 1 #define ELOG_LEVEL_WARN 2 #define ELOG_LEVEL_ERROR 3 // 配置输出级别低于此级别的日志不会输出 #define ELOG_CURRENT_LEVEL ELOG_LEVEL_DEBUG #if ELOG_ENABLE #define ELOG_DEBUG(fmt, ...) \ do { \ if (ELOG_CURRENT_LEVEL ELOG_LEVEL_DEBUG) \ printf([DEBUG] fmt \r\n, ##__VA_ARGS__); \ } while (0) #define ELOG_INFO(fmt, ...) \ do { \ if (ELOG_CURRENT_LEVEL ELOG_LEVEL_INFO) \ printf([INFO] fmt \r\n, ##__VA_ARGS__); \ } while (0) #define ELOG_WARN(fmt, ...) \ do { \ if (ELOG_CURRENT_LEVEL ELOG_LEVEL_WARN) \ printf([WARN] fmt \r\n, ##__VA_ARGS__); \ } while (0) #define ELOG_ERROR(fmt, ...) \ do { \ if (ELOG_CURRENT_LEVEL ELOG_LEVEL_ERROR) \ printf([ERROR] fmt \r\n, ##__VA_ARGS__); \ } while (0) #else #define ELOG_DEBUG(fmt, ...) #define ELOG_INFO(fmt, ...) #define ELOG_WARN(fmt, ...) #define ELOG_ERROR(fmt, ...) #endif #endif五、实战演示#include easy_log.h int main(void) { ELOG_DEBUG(系统初始化成功); ELOG_INFO(当前版本: V1.0.0); ELOG_WARN(传感器信号偏弱); ELOG_ERROR(通信超时重连中...); return 0; }六、进阶优化方向输出重定向到文件、Flash、环形缓冲区增加时间戳、文件名、行号信息支持日志颜色区分支持按模块使能 / 禁用日志增加日志缓存与异步输出七、面试考点与易错坑点面试问答Q1为什么要封装日志不直接用 printf答便于统一管理、分级控制、发布裁剪避免调试代码残留。Q2日志关闭后是否占用资源答用宏实现关闭后编译不生成任何代码无开销。Q3多级日志的工程意义是什么答可按严重程度筛选快速定位错误不被大量调试信息淹没。Q4VA_ARGS是什么作用答表示可变参数让宏支持 printf 风格格式化字符串。Q5do {...} while (0) 为什么要用答让宏在 if/else 等语句中使用时不会出现语法错误。Q6工程上发布版本如何处理日志答直接将 ELOG_ENABLE 置 0一键完全关闭。常见坑点忘记设置日志级别导致部分日志不打印可变参数格式不匹配导致乱码多线程下 printf 未加锁导致输出错乱嵌入式中未重定向 stdout 导致无输出总结简易日志系统是 C 语言工程化开发的基础组件结构简单、实用性极强能显著提升调试效率同时保证发布版本干净无冗余。接口统一、易于扩展可直接在嵌入式、上位机、服务端 C 项目中复用。创作不易如果对你有帮助欢迎点赞、收藏、转发。

相关新闻

深入剖析二阶一型锁相环的局限性与设计权衡

深入剖析二阶一型锁相环的局限性与设计权衡

1. 项目概述:深入二阶一型锁相环的“阿喀琉斯之踵” 在模拟与混合信号电路设计的江湖里,锁相环(PLL)绝对算得上是“内功心法”级别的存在。无论是将一颗不起眼的晶振时钟倍频到GHz级别,还是在嘈杂的通信信号中精准地提…

2026/10/11 22:06:32 阅读更多 →
Java并发编程演进:从平台线程到虚拟线程的实战解析

Java并发编程演进:从平台线程到虚拟线程的实战解析

1. 项目概述:为什么我们需要并行执行? 在Java的世界里,处理一个耗时的任务,比如从数据库读取大量数据、调用外部API或者处理一个复杂的计算,如果让程序“傻等”结果,用户体验会非常糟糕,服务器资…

2026/9/29 13:08:22 阅读更多 →
WiGLE WiFi Wardriving终极指南:Android网络探测与数据收集完全教程

WiGLE WiFi Wardriving终极指南:Android网络探测与数据收集完全教程

WiGLE WiFi Wardriving终极指南:Android网络探测与数据收集完全教程 【免费下载链接】wigle-wifi-wardriving Nethugging client for Android, from wigle.net 项目地址: https://gitcode.com/gh_mirrors/wi/wigle-wifi-wardriving WiGLE WiFi Wardriving是一…

2026/10/12 18:01:25 阅读更多 →

最新新闻

豆瓣电影详情页爬虫实战:requests+BeautifulSoup精准提取元数据

豆瓣电影详情页爬虫实战:requests+BeautifulSoup精准提取元数据

前阵子要做个小型的电影观察分析,缺一批影片的片名、导演、主演、评分、上映日期、片长、剧情简介这类元数据。我一开始想的是手动复制,结果整理了十几部就受不了了——豆瓣详情页的信息密度高,一条影片条目要来回滚动好几次才能把需要的东西…

2026/10/13 11:42:19 阅读更多 →
Rational Rose安装全攻略:Windows10/11兼容性与许可证配置

Rational Rose安装全攻略:Windows10/11兼容性与许可证配置

简介:一份面向软件开发者、系统分析师及项目经理的 IBM Rational Rose 安装教程文档,聚焦 UML 建模工具从下载到配置的完整流程,帮助初学者规避许可证、兼容性等常见安装问题。资源仅含 1 个 docx 文件,压缩包大小 16KB&#xff0…

2026/10/13 11:42:19 阅读更多 →
招聘系统API设计实战:打通钉钉、Jira与Confluence的完整方案

招聘系统API设计实战:打通钉钉、Jira与Confluence的完整方案

做招聘系统的同时把钉钉、Jira、Confluence全部打通,听起来像是个“接口搬运工”的活儿,但真正落地时你会发现,问题根本不在于调用几个API,而在于三种工具的协作模型完全不一样。钉钉是沟通和审批工具,Jira是任务和流程…

2026/10/13 11:42:19 阅读更多 →
SAP S4 HANA S4520 中文采购教程:从物料主数据到供应商评估全流程

SAP S4 HANA S4520 中文采购教程:从物料主数据到供应商评估全流程

简介:这份中文版 SAP S4 HANA S4520 教材面向应用顾问、项目经理及最终用户,聚焦采购模块的系统操作与流程管理,帮助读者从物料主数据维护起步,逐步掌握供应链采购的完整技能体系。资源为单个 PDF 文件,压缩包约 18MB&…

2026/10/13 11:42:19 阅读更多 →
Python函数定义与调用:代码复用与作用域实战指南

Python函数定义与调用:代码复用与作用域实战指南

在日常写 Python 的时候,函数定义与调用大概是最常碰到的语法之一。不管你是刚接触编程的新手,还是已经写了几年业务逻辑的老手,几乎每个脚本里都少不了 def 这个词。很多人的函数用法停留在“能跑就行”的阶段,能定义、能调用、…

2026/10/13 11:42:19 阅读更多 →
昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

26考研的时间点其实很微妙。初试刚结束那阵子,大多数人都在放松,觉得笔试考完就算过了大半关。但真正走过完整流程的人都知道,复试才是淘汰率最集中的环节,尤其对于昆明理工大学MBA这类报考热度一直不低的项目来说,复试…

2026/10/13 11:41:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →