0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何设计嵌入式C语言日志分级?

工程师进阶笔记 来源:漫谈嵌入式 2023-04-04 10:58 次阅读

给大家分享一下嵌入式 C 语言日志分级

日志分级概念

所谓日志分级,就是将日志按照不同的层次,有选择的输出。

参考一些高级语言的分级日志设计,我们根据对程序运行信息的类型把控,可以把日志分为5个级别DEBUG、INFO、WARN、ERROR、FATAL。

DEBUG:主要用于程序开发测试阶段的打印输出,用于验证程序的设计逻辑是否满足上层应用的设计需求,在经过测试检验后的发布程序可以把它关掉。

INFO:这个级别的打印输出是用来告诉测试人员或者开发人员一些提示的信息

WRAN:这是一种警告的打印输出,它一般是用来输出诸如用户输入错误的数据之类的警告打印,这个级别的打印输出在程序发布后也建议保留,以方面后期程序的维护追踪。

ERROR:运行出错的打印,这个级别的打印在发布的软件不可关闭,否则无法从发布软件中获取一些反馈信息来指导我们新的程序优化设计。

FATAL :程序运行遇到这种级别的问题,很难修复,一般伴随着程序的闪退或重启,此时FATAL ERROR的打印则非常关键了,可以帮助我们定位到程序跑飞的原因,FATAL ERROR级别的打印在任何时刻都不可以关闭。

为什么要有日志分级?

一个好的日志分级设计,有助于我们快速定位问题,主要是方便后续开发和维护。在设计软件的时候,可以根据问题出现的轻重缓急,有决策的去添加分层信息,在必要的时候有针对性的打开和关闭一些日志。

如何设计?

目前有两种粗浅的设计策略,一种是或的关系,即各个日志等级彼此独立,可以单独打开关闭;一种是顺序打印,根据设置打印等级,低于或者高于这个等级的才打印。

两种没有孰好孰坏,根据需要选择合适策略即可。本文将以后者介绍。

设置打印级别

/*module_debug.h*/
/*1.设置打印级别*/
enum{
LOG_LEVEL_NONE,
LOG_LEVEL_DEBUG,
LOG_LEVEL_INFO,
LOG_LEVEL_WARN,
LOG_LEVEL_ERROR,
LOG_LEVEL_FATAL,
};

/*2.log打印重写*/
voidlog_fun(intlevel,constchar*opt,constchar*tag,intline,constchar*func,constchar*fmt,...);

/*3.各打印级别宏*/
/*
*@LOG_DBG
*/
#defineLOG_DBG(tag,fmt,...)
log_fun(LOG_LEVEL_DEBUG,"D",tag,__LINE__,__func__,fmt,##__VA_ARGS__)

/*
*@LOG_INFO
*/
#defineLOG_INFO(tag,fmt,...)
log_fun(LOG_LEVEL_INFO,"I",tag,__LINE__,__func__,fmt,##__VA_ARGS__)

/*
*@LOG_WARN
*/
#defineLOG_WARN(tag,fmt,...)
log_fun(LOG_LEVEL_WARN,"W",tag,__LINE__,__func__,fmt,##__VA_ARGS__)

/*
*@LOG_ERR
*/
#defineLOG_ERR(tag,fmt,...)
log_fun(LOG_LEVEL_ERROR,"E",tag,__LINE__,__func__,fmt,##__VA_ARGS__)

/*
*@LOG_FATAL
*/
#defineLOG_FATAL(tag,fmt,...)
log_fun(LOG_LEVEL_FATAL,"F",tag,__LINE__,__func__,fmt,##__VA_ARGS__)

注释:... 和 __VA_ARGS__.省略点表示可变参数,__VA_ARGS__表示可变参数的宏,是C99规范中新增的,用来替换宏定义中的可变参数(...); ##运算符将两个宏参数连接在一起。##__VA_ARGS__ 这里主要是为了解决当__VA_ARGS__为空时编译问题,使用##防止编译出错。

根据打印级别控制输出范围

/*module_debug.c*/
#include
#include
#include
#include
#include
#include

#include

intg_current_dbg_level=LOG_LEVEL_DEBUG;

voidlog_fun(intlevel,constchar*opt,constchar*tag,intline,constchar*func,constchar*fmt,...)
{
if(level>g_current_dbg_level){
charmsg_buf[20*1024];
va_listap;
va_start(ap,fmt);
sprintf(msg_buf,"%s/%s(%d):%s()",opt,tag,line,func);
vsprintf(msg_buf+strlen(msg_buf),fmt,ap);
fprintf(stderr,"%s
",msg_buf);/*输出到标准输出*/
va_end(ap);
}
}

/*设置打印级别*/
voidModuleDebugInit(intlevel)
{
g_current_dbg_level=level;
}

测试

/*main.c*/
#include
#defineTAG"test"

intmain(intargc,char*argv[])
{
    LOG_DBG(TAG,"log_debug%d
",LOG_LEVEL_DEBUG);
LOG_INFO(TAG,"log_info%d
",LOG_LEVEL_INFO);
LOG_WARN(TAG,"log_warn
");
LOG_ERR(TAG,"log_err
");
return0;
}

输出打印信息:

I/test(61):main()log_info2

W/test(62):main()log_warn

E/test(63):main()log_err

其中I表示INFO、W表示WARN、E表示ERROR;紧接着跟着模块(test),也可以是文件名;然后是行号、函数名,最后是打印信息。

当然具体打印信息和风格用户可以根据需要,自行设计。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18281

    浏览量

    288423
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128581
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 日志
    +关注

    关注

    0

    文章

    126

    浏览量

    10525
  • DEBUG
    +关注

    关注

    3

    文章

    83

    浏览量

    19445

原文标题:如何设计嵌入式 C 语言日志分级?

文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是
    发表于 03-25 14:12

    如何成为一名嵌入式C语言高手?

    如何成为一名嵌入式C语言高手? 嵌入式系统是当今科技领域的核心,而C语言则是
    发表于 04-07 16:03

    C语言嵌入式编程修炼之道

    C语言嵌入式编程修炼之道 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作
    发表于 10-31 14:09

    C语言嵌入式系统编程技巧

    C语言嵌入式系统编程技巧不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,
    发表于 12-23 10:40

    嵌入式C语言

    那里可以找到经典的嵌入式C语言学习资料
    发表于 04-25 08:47

    嵌入式C语言设计

    嵌入式C语言设计
    发表于 07-24 09:32

    嵌入式 C 语言

    目录基础知识数据类型const 用法作用域与 static 用法extern 用法基础知识嵌入式C语言和普通C语言在语法上几乎没有差别,其主
    发表于 07-01 08:58

    嵌入式C语言C语言的区别

    嵌入式C语言C语言的区别:最常用的系统编程语言C
    发表于 10-27 06:52

    嵌入式C语言的进阶学习路线资料大合集

    C语言本质上是编程语言的“通用语言”,在今天仍具有极大的影响力。那么,C语言到底学到什么程度,才
    发表于 11-05 06:11

    嵌入式C语言开发与嵌入式Linux C开发的区别

    嵌入式Linux系统开发嵌入式Linux系统开发(应用软件开发):通过内核提供的服务实现相应功能一、嵌入式C语言开发与
    发表于 11-05 08:12

    标准C语言嵌入式C语言有哪些区别

    嵌入式系统是各行各业的具体应用相结合的产物。例如计算机技术、半导体技术、电子技术。其更在乎效率和内存有效使用。嵌入式系统是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。C语言
    发表于 12-14 06:15

    嵌入式开发为什么选择C语言?

    1、嵌入式开发为什么选择C语言?(面试题!!!)嵌入式开发中操作系统是核心,需要移植,并在上层和底层做开发,而操作系统的核心是内核,所有内核的开发都采用
    发表于 12-15 07:45

    嵌入式底层开发为什么选择C语言

    嵌入式应用开发:精通一门语言,熟悉操作系统嵌入式底层开发:精通C语言,熟悉汇编;理解操作系统的实现;熟悉硬件工作原理
    发表于 12-17 08:32

    嵌入式C语言进阶之道

    C 语言的书有一大堆,嵌入 C 语言的书也不少,但都不过是简单介绍一下标准 C
    发表于 04-19 10:15

    分享一下C语言日志分级

    参考一些高级语言分级日志设计,我们根据对程序运行信息的类型把控,可以把日志分为5个级别DEBUG、INFO、WARN、ERROR、FATAL。
    的头像 发表于 03-29 09:46 635次阅读