首页 综合 > 正文

C语言日志分级如何设计? 当前观点

2023-03-28 22:59:52 来源:面包芯语


【资料图】

为什么要有日志分级?

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

如何设计?

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

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

设置打印级别

/*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#includeintg_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\n",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\n",LOG_LEVEL_DEBUG);LOG_INFO(TAG,"log_info%d\n",LOG_LEVEL_INFO);LOG_WARN(TAG,"log_warn\n");LOG_ERR(TAG,"log_err\n");return0;}

输出打印信息:

I/test(61):main()log_info2W/test(62):main()log_warnE/test(63):main()log_err

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

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

标签:

C语言日志分级如何设计? 当前观点

    关注、星标公众号,直达精彩内容来自公众号:漫谈嵌入式作者:Vinsonhello今天给大家分享一下C语言日志分级日志分级概念所谓日志分级

2023-03-28

水文监测显示“中华水塔”水源涵养能力在增强-每日快讯

青海省是黄河、长江及澜沧江的发源地,素有“中华水塔”“江河源头”之称。在第三十六届“中国水周”之际,记者走访青海省水文水资源测报中心

2023-03-28

我区召开2023年度统计工作会议_世界要闻

要准确把握新形势新要求,夯实基层统计力量,强化队伍专业培训,提高统计数据质量,增强执法监督能力,提升统计服务水平,为徐汇高质量发展提

2023-03-28

网络游戏板块跌1.66% 浙数文化涨5.79%居首-热资讯

今日,网络游戏板块整体跌幅1 66%,其中13只股票上涨,0只股票平盘,48只股票下跌。数据显示,截至今日,网络游戏板

2023-03-28

保卫萝卜攻略深海10关(保卫萝卜攻略挑战20)

大家好,小城来为大家解答以上问题。保卫萝卜攻略深海10关,保卫萝卜攻略挑战20很多人还不知道,现在让我们一起来看看吧!1、打开游戏,进

2023-03-28

足球运动员练瑜伽有什么用?让你更持久,更耐造 焦点讯息

对于普雷基来说,这意味着延长了五年职业生涯,并在40岁“高龄”拿下了MLS(美国职业足球大联盟)MVP桂冠。大西洋彼岸,这让加雷斯-巴里对自己的

2023-03-28
x 广告
x 广告

Copyright ©   2015-2023 今日体育网版权所有  备案号:沪ICP备2023005074号-40   联系邮箱:5 85 59 73 @qq.com