文章目录

  • 1.前言
  • 2.功能
    • 2.1 基础打印功能
    • 2.2 增加颜色识别
    • 2.3 增加log输出静默功能
    • 2.4 增加低等级log输出屏蔽功能
    • 2.5 增加查询log等级对应的字符串名称的功能
    • 2.6 其他功能
  • 3.源代码修改
    • 3.1 <log.h>修改
    • 3.2 <log.c>修改
  • 4.测试
    • 4.1 测试基础log输出功能
      • 4.1.1 main函数编写
      • 4.1.2 测试情况
    • 4.2 测试颜色识别功能
      • 4.2.1 代码修改
      • 4.2.2 测试情况
    • 4.3 测试log输出静默功能
      • 4.3.1 main函数编写
      • 4.3.2 测试情况
    • 4.4 测试低等级log输出屏蔽功能
      • 4.4.1 main函数编写
      • 4.4.2 测试情况
    • 4.5 测试查询log等级对应的字符串名称的功能
      • 4.5.1 main函数编写
      • 4.5.2 测试情况
  • 5.例程分享

1.前言

前两天在CSDN上面刷到一些介绍开源项目log.c的文章,称赞log.c是一款轻量级日志库,使用简单。笔者怀着兴趣去log.c的github仓库学习了一下,地址如下:

GitHub - rxi/log.c: A simple logging library implemented in C99

log.c的源码看,非常适合用在嵌入式Linux系统中,但是在MCU中却没法直接使用。因此,笔者对log.c的源码进行修改,使其能够用在MCU中,并保留原本log.c开源项目的大部分功能,下文称此项目为log.c for mcu

2.功能

log.c for mcu主要实现的功能如下:

  • 基础log输出功能
  • 增加颜色识别
  • 增加log输出静默功能
  • 增加低等级log输出屏蔽功能
  • 增加查询log等级对应的字符串名称的功能

2.1 基础打印功能

原本的log.c项目实现了六种log输出等级,如下所示,本质上都是对void log_log(int level, const char *file, int line, const char *fmt, ...)的简单封装,log.c for mcu也要实现该功能。

#define log_trace(...) log_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...)  log_log(LOG_INFO,  __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...)  log_log(LOG_WARN,  __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define log_fatal(...) log_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)

其中,

  • __FILE__ 代表log输出函数所在的文件
  • __LINE__ 代表log输出函数所在的行号
  • __VA_ARGS__ 传输log_trace(...)等宏的括号内的字符串或者可变参数

2.2 增加颜色识别

log.c中增加宏定义LOG_USE_COLOR即可实现几种log以不同颜色输出,显示效果如下:

受宏定义LOG_USE_COLOR影响的主要代码如下:

#ifdef LOG_USE_COLOR
static const char *level_colors[] = {"\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"
};
#endifstatic void stdout_callback(log_Event *ev) {char buf[16];buf[strftime(buf, sizeof(buf), "%H:%M:%S", ev->time)] = '\0';
#ifdef LOG_USE_COLORfprintf(ev->udata, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",buf, level_colors[ev->level], level_strings[ev->level],ev->file, ev->line);
#elsefprintf(ev->udata, "%s %-5s %s:%d: ",buf, level_strings[ev->level], ev->file, ev->line);
#endifvfprintf(ev->udata, ev->fmt, ev->ap);fprintf(ev->udata, "\n");fflush(ev->udata);
}

这段代码使用的fprintf函数以及vfprintf函数在MCU中并不实用,在log.c for mcu中会修改成printf函数和vprintf函数。

需要注意的是,"\x1b[94m"这些配置打印信息显示不同颜色的方式,只有在putty这些终端工具才能产生效果,普通的串口工具如sscom不会产生效果。

2.3 增加log输出静默功能

log.c使用函数void log_set_quiet(bool enable)进行静默使能,按如下方式调用即可关闭log输出功能。

log_set_quiet(true);

2.4 增加低等级log输出屏蔽功能

log.c使用函数void log_set_level(int level)进行低等级log输出屏蔽,低于该函数设置的等级的log输出会被屏蔽。默认屏蔽等级设置为LOG_TRACE,即最低的等级0,所以所有log函数都可以输出。

2.5 增加查询log等级对应的字符串名称的功能

log.c使用函数const char* log_level_string(int level)返回log等级对应的字符串名称,可以方便的了解LOG_DEBUG等字符串对应的log等级,和函数void log_set_level(int level)配合使用。

2.6 其他功能

log.c还有三个功能函数,在MCU裸机中没有用武之地,所以就不移植了。

int log_add_callback(log_LogFn fn, void *udata, int level);
int log_add_fp(FILE *fp, int level);
void log_set_lock(log_LockFn fn, void *udata);

3.源代码修改

3.1 <log.h>修改

  1. 对结构体log_Event进行删减,剔除不需要用的成员;同时删除不需要用的typedef自定义的数据类型。
  2. 删除用不到的函数

3.2 <log.c>修改

  1. 删除不需要用的typedef自定义的数据类型,对结构体L进行删减。
  2. 修改函数static void stdout_callback(log_Event *ev)的内部实现,使其能够在MCU中运行使用。
  3. 修改函数void log_log(int level, const char *file, int line, const char *fmt, ...)的内部实现,和第2点是主要的修改点。
  4. 删除如下不需要使用的函数。
  • static void file_callback(log_Event *ev)
  • static void lock(void)
  • static void unlock(void)
  • void log_set_lock(log_LockFn fn, void *udata)
  • int log_add_callback(log_LogFn fn, void *udata, int level)
  • int log_add_fp(FILE *fp, int level)
  • static void init_event(log_Event *ev, void *udata)

4.测试

将上述章节描述的修改之后的log.c和log.h文件添加到实现串口标准打印输出的程序,同时在main函数中调用相关函数即可,最后基于S32K144EVB-Q100开发板进行测试。

关于实现串口标准打印输出的程序,可以参考如下文章的1.3.3章节。

基于S32K144平台实现两种软件定时器_Auto FAE进阶之路的博客-CSDN博客

4.1 测试基础log输出功能

4.1.1 main函数编写

基础功能的main函数编写如下:

4.1.2 测试情况

使用普通串口工具打印的信息如下:

4.2 测试颜色识别功能

4.2.1 代码修改

在<log.h>中增加如下宏定义:

#define LOG_USE_COLOR

4.2.2 测试情况

使用putty终端工具打印的信息如下:

4.3 测试log输出静默功能

因为正常情况下,MCU串口打印很少使用putty,所以后面的功能演示会取消颜色识别功能。

4.3.1 main函数编写

注释宏定义LOG_USE_COLOR,并修改main函数如下:

4.3.2 测试情况

使用普通串口工具打印的信息如下:

4.4 测试低等级log输出屏蔽功能

4.4.1 main函数编写

main函数修改如下:

4.4.2 测试情况

使用普通串口工具打印的信息如下:

4.5 测试查询log等级对应的字符串名称的功能

4.5.1 main函数编写

main函数修改如下:

4.5.2 测试情况

使用普通串口工具打印的信息如下:

5.例程分享

相关例程已上传百度网盘,链接如下:

  • 链接:https://pan.baidu.com/s/1aSYqoXwDROoX0gMfQvBHtQ
  • 提取码:j3av

如果觉得文章对您有用,帮忙点个关注!!!

如何在S32K144中优雅地输出调试信息相关推荐

  1. android bionic log打印,如何让android的bionic中的linker输出调试信息

    缺省情况下bionic的linker是不会输出调试信息的,因为Linker.c里一开始就写着: * Do NOT use malloc() and friends or pthread_*() cod ...

  2. 日志的log中如何输出变量_如何在kubernetes中优雅的输出日志

    背景 我们经常需要在kubernetes中运行一些任务性质的Job或者Pod.在调试过程中,我们对日志有如下两个需求 需求一:日志输出到stdout.因为stdout的输出,可以非常方便的通过kube ...

  3. php语法中可以输出调试信息,怎么优雅的输出PHP调试信息

    如何优雅的输出PHP调试信息 经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有 ...

  4. 在MFC,Win32程序中向控制台(Console)窗口输出调试信息

    在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...

  5. easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池

    如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...

  6. 如何在MyBatis中优雅的使用枚举

    From: https://segmentfault.com/a/1190000010755321 问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: p ...

  7. 如何在vscode中优雅的编写C语言

    如何在vscode中优雅的编写C语言 各位好,我认为vscode编辑器在windows环境下除了Pycharm外是最方便的IDE了,但在初学C语言时很少有人的第一个C语言软件使用的是vscode来编译 ...

  8. android jni 中实现 LOG 输出调试

    android jni 中实现 LOG 输出调试 在jni 文件夹下 android.mk文件中 添加 LOCAL_LDLIBS += -L$(SYSTEM)/usr/lib -llog 在jni中添 ...

  9. python中如何不换行_如何在Python中不换行输出

    如何在Python中不换行输出 发布时间:2020-09-22 15:04:14 来源:亿速云 阅读:161 作者:小新 小编给大家分享一下如何在Python中不换行输出,希望大家阅读完这篇文章后大所 ...

最新文章

  1. MySQL存储过程简介
  2. iperf3 测速跑不满的解决办法
  3. java 自定义注解获取_Java自定义注解
  4. Vue在插槽slot时报错:Component template should contain exactly one root element. If you are using v-ifen
  5. 被裁之后才明白:有一种抗风险能力,叫做会讲故事
  6. 《经济地理学》读书笔记
  7. MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
  8. 用word写接口文档时的常规格式设置
  9. AXD 调试经验,使用及问题
  10. 工信部发布《2018中国区块链产业白皮书》:量子计算机将给密码体系带来重大安全威胁
  11. 基于LPC1114的闪烁小灯
  12. 某技术总监认为处女座码农要重用,并给出3点原因,你认同么?
  13. R7 4800U对比R5 4600U性能差距
  14. 一个高速交警的忠告(转)
  15. 计算机硬件检测数据恢复理论知识,计算机硬件检测维与数据恢复赛项规程.doc...
  16. 程序员避免面向监狱编程攻略大盘点
  17. ticklength
  18. 什么是云渲染?【谈谈云渲染和传统渲染农场的区别】
  19. WindowsAPI编程 简单的计算器
  20. 《卡尔琳记事本》,召唤师的故事,周更

热门文章

  1. highD变道起止点前后车辆数据获取
  2. fix feeds/telephony/net/freeswitch/Makefile
  3. 2022西式面点师(初级)考试题模拟考试题库及在线模拟考试
  4. 我国支付工具主要有哪几种
  5. Nagios配置飞信报
  6. 冒险岛封包拦截研究!
  7. C++学习笔记(STL篇)string vector迭代器 stack queue
  8. 形变(Deform)开关的本质
  9. php贪吃蛇游戏代码下载,JS实现的贪吃蛇游戏完整实例
  10. 云服务器 ECS,RDS,Redis,SLB服务器建站流程