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

    文章

    7604

    浏览量

    136855

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    介绍一下C语言的优点

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

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

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

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

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

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

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

    C语言常见习题与答案

    C语言常见习题与答案,要考C语言的可以看一下.
    发表于 12-19 15:35 6次下载

    初步感知一下C语言

    今天笔者就带大家跟c语言简单“相个亲”,看看朋友们对c语言的眼缘如何。今天你不需要理解它是什么意思,只是初步感受一下它是什么样的。
    的头像 发表于 05-05 20:10 1311次阅读
    初步感知<b class='flag-5'>一下</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>

    关于C语言些特殊功能介绍

    C语言之所以那么受欢迎,除了C语言历史悠久之外,还有它具有些编程语言没有的功能。那么,今年我们
    的头像 发表于 08-18 15:31 2443次阅读
    关于<b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>一</b>些特殊功能介绍

    介绍一下单片机中的汇编和C语言

    单片机的C语言种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
    的头像 发表于 09-02 16:22 4600次阅读

    六个单片机C语言基础编程源码,了解一下,随时用得上资料下载

    电子发烧友网为你提供六个单片机C语言基础编程源码,了解一下,随时用得上资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-11 08:55 4次下载
    六个单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b>基础编程源码,了解<b class='flag-5'>一下</b>,随时用得上资料下载

    C语言学习笔记

    、前言C语言属于汇编型语言。是区别于解释型语言的(如JAVA)做个比较 编译型语言
    发表于 11-26 13:06 6次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>学习笔记

    跟我从零开始学C语言系列(

    让我们先来了解一下 C 语言C 语言种用途广泛、功能强大、使用灵活的高级
    的头像 发表于 01-29 17:45 1412次阅读

    介绍一下linux内核比较优秀的调试方式KGDB

    printf相信学过C语言的同志再熟悉不过了,然而在linux内核开发中有种非常简洁的日志输出函数叫-printk。
    的头像 发表于 03-08 13:45 1861次阅读

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

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

    C++异步日志实践

    个高效可拓展的异步C++日志库:RING LOG,本文分享了了其设计方案与技术原理等内容 导论 同步日志与缺点 传统的日志也叫同步
    的头像 发表于 11-09 10:29 674次阅读
    <b class='flag-5'>C</b>++异步<b class='flag-5'>日志</b>实践