0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一下C語言日志分級

技術(shù)讓夢想更偉大 ? 來源:漫談嵌入式 ? 2023-03-29 09:46 ? 次閱讀

日志分級概念

所謂日志分級,就是將日志按照不同的層次,有選擇的輸出。

參考一些高級語言的分級日志設(shè)計(jì),我們根據(jù)對程序運(yùn)行信息的類型把控,可以把日志分為5個(gè)級別DEBUG、INFO、WARN、ERROR、FATAL。

DEBUG:主要用于程序開發(fā)測試階段的打印輸出,用于驗(yàn)證程序的設(shè)計(jì)邏輯是否滿足上層應(yīng)用的設(shè)計(jì)需求,在經(jīng)過測試檢驗(yàn)后的發(fā)布程序可以把它關(guān)掉。

INFO:這個(gè)級別的打印輸出是用來告訴測試人員或者開發(fā)人員一些提示的信息

WRAN:這是一種警告的打印輸出,它一般是用來輸出諸如用戶輸入錯(cuò)誤的數(shù)據(jù)之類的警告打印,這個(gè)級別的打印輸出在程序發(fā)布后也建議保留,以方面后期程序的維護(hù)追蹤。

ERROR:運(yùn)行出錯(cuò)的打印,這個(gè)級別的打印在發(fā)布的軟件不可關(guān)閉,否則無法從發(fā)布軟件中獲取一些反饋信息來指導(dǎo)我們新的程序優(yōu)化設(shè)計(jì)。

FATAL :程序運(yùn)行遇到這種級別的問題,很難修復(fù),一般伴隨著程序的閃退或重啟,此時(shí)FATAL ERROR的打印則非常關(guān)鍵了,可以幫助我們定位到程序跑飛的原因,F(xiàn)ATAL ERROR級別的打印在任何時(shí)刻都不可以關(guān)閉。

為什么要有日志分級?

一個(gè)好的日志分級設(shè)計(jì),有助于我們快速定位問題,主要是方便后續(xù)開發(fā)和維護(hù)。在設(shè)計(jì)軟件的時(shí)候,可以根據(jù)問題出現(xiàn)的輕重緩急,有決策的去添加分層信息,在必要的時(shí)候有針對性的打開和關(guān)閉一些日志。

如何設(shè)計(jì)?

目前有兩種粗淺的設(shè)計(jì)策略,一種是或的關(guān)系,即各個(gè)日志等級彼此獨(dú)立,可以單獨(dú)打開關(guān)閉;一種是順序打印,根據(jù)設(shè)置打印等級,低于或者高于這個(gè)等級的才打印。

兩種沒有孰好孰壞,根據(jù)需要選擇合適策略即可。本文將以后者介紹。

設(shè)置打印級別

/*module_debug.h*/
/*1.設(shè)置打印級別*/
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__.省略點(diǎn)表示可變參數(shù),__VA_ARGS__表示可變參數(shù)的宏,是C99規(guī)范中新增的,用來替換宏定義中的可變參數(shù)(...); ##運(yùn)算符將兩個(gè)宏參數(shù)連接在一起。##__VA_ARGS__ 這里主要是為了解決當(dāng)__VA_ARGS__為空時(shí)編譯問題,使用##防止編譯出錯(cuò)。

根據(jù)打印級別控制輸出范圍

/*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);/*輸出到標(biāo)準(zhǔn)輸出*/
va_end(ap);
}
}

/*設(shè)置打印級別*/
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表示W(wǎng)ARN、E表示ERROR;緊接著跟著模塊(test),也可以是文件名;然后是行號、函數(shù)名,最后是打印信息。

當(dāng)然具體打印信息和風(fēng)格用戶可以根據(jù)需要,自行設(shè)計(jì)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134315

原文標(biāo)題:C語言日志分級如何設(shè)計(jì)?

文章出處:【微信號:技術(shù)讓夢想更偉大,微信公眾號:技術(shù)讓夢想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    剛學(xué)C語言,找到不少資料分享一下!

    剛學(xué)C語言,找到不少資料分享一下!
    發(fā)表于 09-08 21:43

    介紹一下C語言的優(yōu)點(diǎn)

    秀的程序設(shè)計(jì)語言之一。下面,介紹一下C語言的優(yōu)秀之處:1.可進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)C語言是以函數(shù)作為
    發(fā)表于 07-14 06:34

    請問一下C語言定是從main函數(shù)開始執(zhí)行的嗎?

    請問一下C語言定是從main函數(shù)開始執(zhí)行的嗎?
    發(fā)表于 10-14 07:47

    在OpenHarmony上使用js和c語言開發(fā),如何將日志保存在文件中?

    在運(yùn)行過程中,各種普通日志在打印文件中保存,出現(xiàn)應(yīng)用問題時(shí),通過獲取到日志文件時(shí)的應(yīng)用進(jìn)行分析。在node.js中,可以將日志打印的輸出流控制器為文件自動運(yùn)行。我想問一下,在 Open
    發(fā)表于 03-30 09:40

    在OpenHarmony上使用js和c語言開發(fā)如何將日志保存在文件中?

    在應(yīng)用運(yùn)行過程中,般會將日志打印在文件中保存,當(dāng)應(yīng)用出現(xiàn)問題時(shí),通過各種途徑獲取到日志文件對其進(jìn)行分析。在node.js中,可以將日志打印的輸出流重定向?yàn)槲募纯?。我想?/div>
    發(fā)表于 04-25 10:11

    C語言常見習(xí)題與答案

    C語言常見習(xí)題與答案,要考C語言的可以看一下.
    發(fā)表于 12-19 15:35 ?6次下載

    初步感知一下C語言

    今天筆者就帶大家跟c語言簡單“相個(gè)親”,看看朋友們對c語言的眼緣如何。今天你不需要理解它是什么意思,只是初步感受一下它是什么樣的。
    的頭像 發(fā)表于 05-05 20:10 ?1237次閱讀
    初步感知<b class='flag-5'>一下</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>

    關(guān)于C語言些特殊功能介紹

    C語言之所以那么受歡迎,除了C語言歷史悠久之外,還有它具有些編程語言沒有的功能。那么,今年我們
    的頭像 發(fā)表于 08-18 15:31 ?2308次閱讀
    關(guān)于<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>一</b>些特殊功能介紹

    介紹一下單片機(jī)中的匯編和C語言

    單片機(jī)的C語言種編譯型程序設(shè)計(jì)語言,它兼顧了多種高級語言的特點(diǎn),并具備匯編語言的功能。
    的頭像 發(fā)表于 09-02 16:22 ?4431次閱讀

    六個(gè)單片機(jī)C語言基礎(chǔ)編程源碼,了解一下,隨時(shí)用得上資料下載

    電子發(fā)燒友網(wǎng)為你提供六個(gè)單片機(jī)C語言基礎(chǔ)編程源碼,了解一下,隨時(shí)用得上資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-11 08:55 ?4次下載
    六個(gè)單片機(jī)<b class='flag-5'>C</b><b class='flag-5'>語言</b>基礎(chǔ)編程源碼,了解<b class='flag-5'>一下</b>,隨時(shí)用得上資料下載

    C語言學(xué)習(xí)筆記

    、前言C語言屬于匯編型語言。是區(qū)別于解釋型語言的(如JAVA)做個(gè)比較 編譯型語言
    發(fā)表于 11-26 13:06 ?6次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>學(xué)習(xí)筆記

    跟我從零開始學(xué)C語言系列(

    讓我們先來了解一下 C 語言。C 語言種用途廣泛、功能強(qiáng)大、使用靈活的高級
    的頭像 發(fā)表于 01-29 17:45 ?1318次閱讀

    介紹一下linux內(nèi)核比較優(yōu)秀的調(diào)試方式KGDB

    printf相信學(xué)過C語言的同志再熟悉不過了,然而在linux內(nèi)核開發(fā)中有種非常簡潔的日志輸出函數(shù)叫-printk。
    的頭像 發(fā)表于 03-08 13:45 ?1599次閱讀

    如何設(shè)計(jì)嵌入式C語言日志分級?

    所謂日志分級,就是將日志按照不同的層次,有選擇的輸出。
    的頭像 發(fā)表于 04-04 10:58 ?594次閱讀

    C++異步日志實(shí)踐

    個(gè)高效可拓展的異步C++日志庫:RING LOG,本文分享了了其設(shè)計(jì)方案與技術(shù)原理等內(nèi)容 導(dǎo)論 同步日志與缺點(diǎn) 傳統(tǒng)的日志也叫同步
    的頭像 發(fā)表于 11-09 10:29 ?532次閱讀
    <b class='flag-5'>C</b>++異步<b class='flag-5'>日志</b>實(shí)踐