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

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

3天内不再提示

嵌入式软件框架中一定不能缺少的日志管理系统的设计与实现

嵌入式应用研究院 来源:漫游嵌入式 2023-04-19 09:14 次阅读

日志分级概念

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

参考一些高级语言的分级日志设计,我们根据对程序运行信息的类型把控,可以把日志分为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),也可以是文件名;然后是行号、函数名,最后是打印信息。

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


			

审核编辑 :李倩


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

    关注

    117

    文章

    3791

    浏览量

    81153
  • 嵌入式软件
    +关注

    关注

    4

    文章

    240

    浏览量

    26660
  • 日志
    +关注

    关注

    0

    文章

    138

    浏览量

    10655

原文标题:嵌入式软件框架中一定不能缺少的日志管理系统的设计与实现

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么叫嵌入式软件

    需要给它设计套小小的可以嵌在里面的脑系统,这个大脑有多聪明,就要看它的软件了。这个嵌在里面的脑系统就是
    发表于 04-20 08:45

    嵌入式系统串行设备管理怎么实现

    随着微电子技术的发展,嵌入式系统的功能越来越强大,像 UART口、IrDA、USB、I2C以及SPI这些串行接口或设备同时存在于嵌入式系统
    发表于 09-04 07:53

    嵌入式系统基础阶段的学习建议

    的。(4)至于嵌入式实时操作系统RTOS,一定不要开始就学,这样会走很多弯路,也会使你对嵌入式系统
    发表于 10-29 07:36

    嵌入式框架

    1.overview 图1-1 嵌入式框架嵌入式系统分为硬件以及软件两大部分,大多数人参与的是嵌入式
    发表于 10-27 08:26

    嵌入式低功耗电源管理框架的设计资料分享

    概述目标本篇的目标是介绍低功耗电源管理框架设计的概念理解低功耗管理的重要性理解如何开发适合的低功耗管理框架理解如何去
    发表于 12-21 07:39

    嵌入式些日常小技巧分享

    拓宽自己的技术领域同时也要在像更加面向对象或者是高级AI方向的算法也要有一定的涉猎,所以目前对于我而言Python和C++成了我在目前学习嵌入式操作系统的同时也要必须掌握的层技术又因
    发表于 12-21 08:07

    嵌入式软件和非嵌入式软件区别

    1.什么是嵌入式技术?嵌入式技术是以应用为中心,以计算机技术为基础的系统技术。它初起源于单片机技术,是各类数字化的电子、机电产品的核心,主要用于实现对硬件设备的控制、监视或
    发表于 12-21 07:41

    嵌入式软件建立统框架方法的研究

    介绍了嵌入式系统软件的特点#说明要建立统嵌入式软件系统框架
    发表于 11-07 16:02 27次下载

    嵌入式系统框架----硬件篇

    1.系统框架图对于嵌入式系统,最重要的当然是运算以及存储单元,基本的嵌入式
    发表于 10-20 11:51 3次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>框架</b>----硬件篇

    嵌入式系统框架----软件

    1.overview 图1-1 嵌入式框架嵌入式系统分为硬件以及
    发表于 10-20 19:21 5次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>框架</b>----<b class='flag-5'>软件</b>篇

    嵌入式linux设备中应用运行日志实现

    嵌入式linux设备中应用运行日志实现      最近在做个项目时,需要记录设备运行中情况,以方便对故障进行跟踪定位,完善.所以决定采用记录程序运行
    发表于 11-01 17:22 8次下载
    <b class='flag-5'>嵌入式</b>linux设备中应用运行<b class='flag-5'>日志</b>的<b class='flag-5'>实现</b>

    嵌入式开发|嵌入式软件框架《二》前后台任务框架-cola os系统

    创建4.cola_os stime定时器创建前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是个必须认真考虑的问题。软件架构对
    发表于 11-03 13:51 18次下载
    <b class='flag-5'>嵌入式</b>开发|<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b><b class='flag-5'>框架</b>《二》前后台任务<b class='flag-5'>框架</b>-cola os<b class='flag-5'>系统</b>

    嵌入式设备系统日志记录方法

    嵌入式设备应用场景中,系统日志时常可以监控设备软件的运行状态,及时记录问题点以及关键信息,方便开发人员后期定位以及解决问题。本文将讲述
    的头像 发表于 03-28 15:20 5403次阅读

    嵌入式SD NAND】基于FATFS/Littlefs文件系统日志框架实现

    文章目录 【嵌入式】基于FATFS/Littlefs文件系统日志框架实现 1. 概述 2. 设计概要 3. 设计
    的头像 发表于 03-14 18:13 1076次阅读
    【<b class='flag-5'>嵌入式</b>SD NAND】基于FATFS/Littlefs文件<b class='flag-5'>系统</b>的<b class='flag-5'>日志</b><b class='flag-5'>框架</b><b class='flag-5'>实现</b>

    嵌入式SD NAND】基于FATFS/Littlefs文件系统日志框架实现

    文章目录【嵌入式】基于FATFS/Littlefs文件系统日志框架实现1.概述2.设计概要3.设计实现
    的头像 发表于 03-14 18:12 1179次阅读
    【<b class='flag-5'>嵌入式</b>SD NAND】基于FATFS/Littlefs文件<b class='flag-5'>系统</b>的<b class='flag-5'>日志</b><b class='flag-5'>框架</b><b class='flag-5'>实现</b>