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

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

3天内不再提示

分享一下C语言日志分级

技术让梦想更伟大 来源:漫谈嵌入式 2023-03-29 09:46 次阅读

日志分级概念

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

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

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






审核编辑:刘清

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

    关注

    180

    文章

    7530

    浏览量

    128658

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

文章出处:【微信号:技术让梦想更伟大,微信公众号:技术让梦想更伟大】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [推荐]linuxc语言编程简介

    章本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,LinuxC
    发表于 04-29 13:50

    刚学C语言,找到不少资料分享一下

    刚学C语言,找到不少资料分享一下
    发表于 09-08 21:43

    这两道嵌入式c语言的题目谁能帮我指导一下

    本帖最后由 斌哥__ 于 2016-1-22 10:23 编辑 大家好,这两道C语言的题目我解决不了,谁能我为我解决一下呢?万分感谢。
    发表于 01-22 10:19

    介绍一下C语言的优点

    秀的程序设计语言之一。下面,介绍一下C语言的优秀之处:1.可进行结构化程序设计C语言是以函数作为
    发表于 07-14 06:34

    请问一下C语言定是从main函数开始执行的吗?

    请问一下C语言定是从main函数开始执行的吗?
    发表于 10-14 07:47

    请问一下从事单片机工作,C语言要达到什么水平?

    请问一下从事单片机工作,C语言要达到什么水平?
    发表于 10-14 08:06

    请问一下C语言如何通过移位来实现算术乘除?

    请问一下C语言如何通过移位来实现算术乘除?
    发表于 10-19 06:48

    请问一下怎么清除终端执行会ping输出的日志

    请问一下怎么清除终端执行会ping输出的日志呢?
    发表于 12-29 06:05

    介绍一下C语言的预处理知识与宏定义原理

    系统平台上的gcc)前言本篇文章将会向大家介绍一下C语言的预处理知识、宏定义、函数、以及编译执行程序所需的静态链接库和动态链接库的些原理,有助于大家更深层次的理解
    发表于 02-11 06:35

    分析一下C语言strlen需要注意的几点

    1、聊聊和bug菌同龄的小伙伴在听这首歌的时候,脑海中应该很有画面感吧,转眼间这首歌曲已经有20年了!今天主要是跟大家分析一下C语言strlen需要注意的几点,编码的时...
    发表于 02-16 06:14

    请问一下怎样去使用C语言中的typedef呢

    请问一下怎样去使用C语言中的typedef呢?
    发表于 02-25 07:05

    在OpenHarmony上使用js和c语言开发,如何将日志保存在文件中?

    在运行过程中,各种普通日志在打印文件中保存,出现应用问题时,通过获取到日志文件时的应用进行分析。在node.js中,可以将日志打印的输出流控制器为文件自动运行。我想问一下,在 Open
    发表于 03-30 09:40

    请问OpenHarmony的JS如何将日志打印到文件中?

    在运行过程中,各种普通日志在打印文件中保存,出现应用问题时,通过获取到日志文件时的应用进行分析。在node.js中,可以将日志打印的输出流控制器为文件自动运行。我想问一下,在 Open
    发表于 04-21 11:25

    在OpenHarmony上使用js和c语言开发如何将日志保存在文件中?

    在应用运行过程中,般会将日志打印在文件中保存,当应用出现问题时,通过各种途径获取到日志文件对其进行分析。在node.js中,可以将日志打印的输出流重定向为文件即可。我想问
    发表于 04-25 10:11

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

    所谓日志分级,就是将日志按照不同的层次,有选择的输出。
    的头像 发表于 04-04 10:58 457次阅读