一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

工程師進(jìn)階筆記 ? 來源:漫談嵌入式 ? 2023-04-04 10:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

給大家分享一下嵌入式 C 語言日志分級(jí)

日志分級(jí)概念

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

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

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

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

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

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

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

為什么要有日志分級(jí)?

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

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

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

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

設(shè)置打印級(jí)別

/*module_debug.h*/
/*1.設(shè)置打印級(jí)別*/
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.各打印級(jí)別宏*/
/*
*@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ù)打印級(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è)置打印級(jí)別*/
voidModuleDebugInit(intlevel)
{
g_current_dbg_level=level;
}

測(cè)試

/*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),也可以是文件名;然后是行號(hào)、函數(shù)名,最后是打印信息。

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

審核編輯:湯梓紅

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

    關(guān)注

    5149

    文章

    19659

    瀏覽量

    317356
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141615
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    82956
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    144

    瀏覽量

    10863
  • DEBUG
    +關(guān)注

    關(guān)注

    3

    文章

    94

    瀏覽量

    20535

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

文章出處:【微信號(hào):工程師進(jìn)階筆記,微信公眾號(hào):工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式C語言知識(shí)點(diǎn)總結(jié)

    怎么才能做好嵌入式開發(fā)?學(xué)好C語言吧!今天就來推薦一篇大佬寫的嵌入式C語言知識(shí)點(diǎn)總結(jié)。
    發(fā)表于 09-27 09:53 ?1386次閱讀

    嵌入式c語言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語言編程的各項(xiàng)知識(shí),包括嵌入式c語言編程,
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語言</b>編程(由淺入深)

    嵌入式 C C++語言精華文章集錦

    嵌入式 C C++語言精華文章集錦
    發(fā)表于 02-08 01:28 ?10次下載

    嵌入式C/C++語言精華文章集錦

    嵌入式C/C++語言精華文章集錦
    發(fā)表于 10-27 14:48 ?65次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>語言</b>精華文章集錦

    嵌入式外中斷c語言代碼

    嵌入式外中斷c語言代碼(arm嵌入式開發(fā)實(shí)例)-嵌入式外中斷c
    發(fā)表于 07-30 11:29 ?5次下載
    <b class='flag-5'>嵌入式</b>外中斷<b class='flag-5'>c</b><b class='flag-5'>語言</b>代碼

    嵌入式C語言-文件操用

    嵌入式C語言-文件操用(嵌入式開發(fā)需要什么證書)-嵌入式C
    發(fā)表于 07-30 11:56 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>-文件操用

    嵌入式底層開發(fā)為什么選擇C語言

    嵌入式底層開發(fā)為什么選擇C語言嵌入式系統(tǒng)的編寫語言主要是C
    發(fā)表于 10-20 13:35 ?2次下載
    <b class='flag-5'>嵌入式</b>底層開發(fā)為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>

    標(biāo)準(zhǔn)c語言嵌入式,嵌入式C語言C語言的區(qū)別

    嵌入式C語言C語言的區(qū)別:最常用的系統(tǒng)編程語言C
    發(fā)表于 10-20 14:06 ?6次下載
    標(biāo)準(zhǔn)<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區(qū)別

    嵌入式c語言 c語言_C嵌入式C有什么區(qū)別?

    嵌入式c語言 c語言C programming language was designed by
    發(fā)表于 10-21 10:21 ?4次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語言</b> <b class='flag-5'>c</b><b class='flag-5'>語言</b>_<b class='flag-5'>C</b>和<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>有什么區(qū)別?

    嵌入式linux c語言,嵌入式LinuxC語言開發(fā)工具.pdf

    2 章 嵌入式Linux C 語言開發(fā)工具本章目標(biāo)任何應(yīng)用程序的開發(fā)都離不開編輯器、編譯器及調(diào)試器,嵌入式Linux 的C
    發(fā)表于 11-01 17:38 ?12次下載
    <b class='flag-5'>嵌入式</b>linux <b class='flag-5'>c</b><b class='flag-5'>語言</b>,<b class='flag-5'>嵌入式</b>LinuxC<b class='flag-5'>語言</b>開發(fā)工具.pdf

    C語言嵌入式培訓(xùn) 嵌入式C語言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語言C語言,因此先掌握C語言對(duì)于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設(shè)計(jì)基礎(chǔ)

    嵌入式C語言知識(shí)總結(jié)

    1 嵌入式C語言總結(jié)從語法上來說C語言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的嵌入式
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>知識(shí)總結(jié)

    c語言嵌入式編程

    比較詳盡的嵌入式C語言解答和分析
    發(fā)表于 03-10 14:53 ?162次下載

    分享一下C語言日志分級(jí)

    參考一些高級(jí)語言分級(jí)日志設(shè)計(jì),我們根據(jù)對(duì)程序運(yùn)行信息的類型把控,可以把日志分為5個(gè)級(jí)別DEBUG、INFO、WARN、ERROR、FATAL。
    的頭像 發(fā)表于 03-29 09:46 ?1348次閱讀

    嵌入式C語言的結(jié)構(gòu)特點(diǎn)

    嵌入式開發(fā)中既有底層硬件的開發(fā)又涉及上層應(yīng)用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語言既具有匯編語言操作底層的優(yōu)勢(shì),又具有高級(jí)語言功能性強(qiáng)的特點(diǎn)
    的頭像 發(fā)表于 11-24 16:16 ?1117次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的結(jié)構(gòu)特點(diǎn)