【资料图】
为什么要有日志分级?
一个好的日志分级设计,有助于我们快速定位问题,主要是方便后续开发和维护。在设计软件的时候,可以根据问题出现的轻重缓急,有决策的去添加分层信息,在必要的时候有针对性的打开和关闭一些日志。
如何设计?
目前有两种粗浅的设计策略,一种是或的关系,即各个日志等级彼此独立,可以单独打开关闭;一种是顺序打印,根据设置打印等级,低于或者高于这个等级的才打印。
两种没有孰好孰坏,根据需要选择合适策略即可。本文将以后者介绍。
设置打印级别
/*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\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),也可以是文件名;然后是行号、函数名,最后是打印信息。
当然具体打印信息和风格用户可以根据需要,自行设计。
Copyright © 2015-2023 今日体育网版权所有 备案号:沪ICP备2023005074号-40 联系邮箱:5 85 59 73 @qq.com