這兩天發(fā)現(xiàn)一個還不錯的開源項目,記錄一下學(xué)習(xí)心得。對于嵌入式底層應(yīng)用開發(fā),基本離不開日志功能,這種輪子有很多,log.c 最簡單,達(dá)到了開箱即用的級別。
log.c 是什么?
https://github.com/rxi/log.c 簡單地說,log.c 就是一個 C 語言的日志功能模塊。點(diǎn)擊查看大圖log.c 的幾個特點(diǎn):代碼簡潔,就一個 .c 和 .h 文件,一共 200 行。設(shè)計優(yōu)雅,打印日志的 API 只有 1 個。提供了將 log 輸入到不同目標(biāo)的接口,例如輸入到文件。提供了實(shí)現(xiàn)線程安全的接口。
log.c 怎么用?
打印日志的 API:log_trace(constchar*fmt,...); log_debug(constchar*fmt,...); log_info(constchar*fmt,...); log_warn(constchar*fmt,...); log_error(constchar*fmt,...); log_fatal(constchar*fmt,...); 它們都是對 log_log() 的簡單封裝,用法和 printf() 一樣。示例:下面的例子會將日志同時輸出到標(biāo)準(zhǔn)輸出和文件中。
#include"log.h" intmain(intargc,char*argv[]) { log_set_level(0); log_set_quiet(0); FILE*fp1,*fp2; fp1=fopen("./log_info.txt","ab"); if(fp1==NULL) return-1; fp2=fopen("./log_debug.txt","ab"); if(fp2==NULL) return-1; log_add_fp(fp1,LOG_INFO); log_add_fp(fp2,LOG_DEBUG); log_debug("debug"); log_info("info"); log_warn("warn"); fclose(fp2); fclose(fp1); return0; } 運(yùn)行:
$./example1 2305DEBUGexample1.cdebug 2305INFOexample1.cinfo 2305WARNexample1.cwarn $catlog_debug.txt 2022-05-082305DEBUGexample1.cdebug 2022-05-082305INFOexample1.cinfo 2022-05-082305WARNexample1.cwarn $catlog_info.txt 2022-05-082305INFOexample1.cinfo 2022-05-082305WARNexample1.cwarn 關(guān)于線程安全:log.c 代碼雖然少,但是仍然考慮了線程安全,下面是用法示例。
#include"log.h" pthread_mutex_tMUTEX_LOG; voidlog_lock(boollock,void*udata); intmain() { log_set_level(0); log_set_quiet(0); pthread_mutex_init(&MUTEX_LOG,NULL); log_set_lock(log_lock,&MUTEX_LOG); /*Insertthreadedapplicationcodehere...*/ log_info("I'mthreadsafe"); pthread_mutex_destroy(&MUTEX_LOG); return0; } voidlog_lock(boollock,void*udata) { pthread_mutex_t*LOCK=(pthread_mutex_t*)(udata); if(lock) pthread_mutex_lock(LOCK); else pthread_mutex_unlock(LOCK); }
log.c 的內(nèi)部實(shí)現(xiàn)?
私有數(shù)據(jù)結(jié)構(gòu):點(diǎn)擊查看大圖全局變量 L 維護(hù)了 log.c 所需要的所有信息。void *udata 用于保存用戶數(shù)據(jù),用戶可以將其用作任意用途。lock 是一個函數(shù)指針:。typedefvoid(*log_LockFn)(boollock,void*udata); 用戶可以用它來指定自己想用的鎖機(jī)制,例如 Pthread 的互斥量。int level 用于保存當(dāng)前的 log 等級,等級大于 level 的 log 才會被輸出到標(biāo)準(zhǔn)輸出。bool quiet 用于打開、關(guān)閉 log 輸出。數(shù)組 callbacks 用于保存多種輸出方式,目前僅支持輸出到標(biāo)準(zhǔn)輸出和文件,有需要的話我們還可以將其擴(kuò)展成輸出到 syslog、網(wǎng)絡(luò)等,每增加一種輸出方式就是構(gòu)造一個 Callback,成員回調(diào)函數(shù) log_LogFn 負(fù)責(zé)真正地 log 輸出功能:
typedefvoid(*log_LogFn)(log_Event*ev); 公共數(shù)據(jù)結(jié)構(gòu):點(diǎn)擊查看大圖一條 log 信息對應(yīng)一個 log_Event。暴露這個數(shù)據(jù)結(jié)構(gòu)是為了用戶可以編寫自己的 log 打印函數(shù) log_LogFn 以輸出 log。公共的 API:整個 log.c 其實(shí)只提供了一個打印相關(guān)的 API:log_log()。log_trace() 等宏只是對 log_log() 的簡單封裝,這種簡潔地設(shè)計無論是對庫的用戶還是對庫的開發(fā)者而言,都是最幸福的事情。剩下的幾個 API 用于控制和功能擴(kuò)展。log_log() 的實(shí)現(xiàn)思路:1> 根據(jù)用于提供的 log 信息構(gòu)造 1個 log_Event。2> 將 log 信息輸出到標(biāo)準(zhǔn)輸出。3> 遍歷所有 log Callback,逐一調(diào)用它們的打印函數(shù) log_LogFn。
總結(jié)
log.c 代碼優(yōu)雅、設(shè)計簡潔、功能實(shí)用,這對庫的用戶和庫的開發(fā)者而言,都是一種幸福。如果你的項目需要一個簡單好用的日志功能,可以考慮集成開箱即用的 log.c審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
嵌入式
+關(guān)注
關(guān)注
5093文章
19178瀏覽量
307704 -
開源項目
+關(guān)注
關(guān)注
0文章
38瀏覽量
7254
原文標(biāo)題:調(diào)試?yán)鳎∫豢钶p量級日志庫 log.c
文章出處:【微信號:knifewheat,微信公眾號:小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
LOG114的bxl文件轉(zhuǎn)換封裝出錯是哪里的問題?
上面是生成的log.txt文件,不知為何原理圖中的引腳數(shù)是17而封裝的管腳數(shù)是21,是官網(wǎng)的封裝文件有問題嗎?
轉(zhuǎn)換時錯誤提示:
這是為什么
發(fā)表于 09-10 06:31
LOG114開發(fā)板能否直接接銦鎵砷探測器?
請問LOG114開發(fā)板能否直接接銦鎵砷探測器,然后測試LOG114的輸出。
我想把LOG114的輸出直接接到ADC的采集板,ADC是14bits的,用1K的采樣頻率,請問采樣的AD值會不會穩(wěn)定
發(fā)表于 08-05 07:42
LOG114 VLogout輸出不正常的原因?
你好,這是我的電路圖,目前的問題是VLogout的輸出不正常,不服從VLogout=0.375*log(I1/I2)+2.5V。
我之前使用log114芯片的時候,背部的exposed
發(fā)表于 08-02 08:02
用U盤記錄系統(tǒng)LOG信息的簡單步驟和方法
? # 01 前言 MCU 組成的系統(tǒng)在實(shí)際應(yīng)用中,經(jīng)常需要記錄系統(tǒng) LOG 信息,可以是系統(tǒng)不同任務(wù)執(zhí)行情況的 LOG 信息,也可以是內(nèi)核寄存器等便于維護(hù)調(diào)試的信息,或者是傳感器的信息等。 上述
LOG114怎么測試整個輸入端的輸入噪聲電壓和噪聲電流?
比如log114、log112這種由三極管組成的跨阻放大器,技術(shù)手冊里只給了放大器的噪聲電壓和噪聲電流,三極管的相關(guān)參數(shù)沒有給,那么怎么分析芯片整個輸入端的輸入噪聲電壓。
2,如果要自己測量芯片的整個輸入端的輸入噪聲電壓和噪聲電流該怎么測試?
發(fā)表于 07-30 08:12
如何換算LOG200的輸入帶寬最大范圍?
目前我司使用的是AD8305尋求LOG200進(jìn)行替換,關(guān)于LOG200的信息仍然是偏少的,我希望獲得更多關(guān)于它的信息,主要點(diǎn)是關(guān)于帶寬的問題,我們的光學(xué)系統(tǒng)設(shè)計的帶寬計算為最高可能達(dá)到20MHz
發(fā)表于 07-29 07:02
求助,關(guān)于log114輸入端電流仿真問題求解
我用以下兩種方式對log114輸入端口輸入電流進(jìn)行仿真,為什么仿真中第一個的輸入端口電壓會變化而不是保持2V。輸入端口R5的阻值10K保持不變,輸入端電流IS1變化的時候,log114的輸入端的電壓也會變化,這是為什么呢
發(fā)表于 07-29 06:42
ESP32--C3--MINI--1U模組,U0Tx輸出log,不能正常輸出低電平是為什么?
原理圖設(shè)計:
示波器測試到的log輸出波形:
原理圖設(shè)計如上,正常上電輸出的log,低電平有0.6-0.7V左右,時常不能正常輸出數(shù)據(jù),當(dāng)進(jìn)入下載固件后,log輸出低更是超過1.5V,flash下載工具,無法獲取到芯片信息,導(dǎo)致
發(fā)表于 07-01 08:24
esp-mdf禁用log輸出報錯的原因?
因為esp32的三個串口在項目中都占用了,所以要禁用log輸出。
通過下面的配置后,編譯報錯。
錯誤信息:
esp-mdf/components/mdebug/mdebug_console.c
發(fā)表于 06-28 13:22
esp-adf大版本升級到最新,播放音頻的log怎么關(guān)閉呢?
esp-adf大版本升級到最新,播放音頻的log怎么關(guān)閉
4976) ADF_BIT_STREAM: length = 960, bytenum = 0, bread = 960
D (4977
發(fā)表于 06-28 07:41
ESP32S2關(guān)閉ADC/DAC后重啟的原因?
)0x400f3601: esp_log_writev at C:/Users/Administrator/Desktop/esp-idf/components/log/log.c:1
發(fā)表于 06-20 06:26
ESP32C3編譯出現(xiàn)multiple definition of `g_log_level\'的原因?
如題,一個原是ESP32的物聯(lián)網(wǎng)例程,在改為ESP32C3后,編譯出現(xiàn)multiple definition of `g_log_level\'不良。
[2/3] Linking CXX
發(fā)表于 06-19 08:28
使用ESP32-S2的TWAI(CAN)功能,開啟WIFI連接路由器會重啟的原因?
/vprintf.c:34 (discriminator 5)0x4011391d: esp_log_writev at D:/esp-idf/components/log/log.c
發(fā)表于 06-14 08:06
如何檢查日志中是否有類似cm_cy_log_msg( CYLF_MIDDLEWARE, CY_LOG_ERR) 的內(nèi)容?
運(yùn)行,有什么方法可以檢查 cm_cy_log_msg 生成的日志? 像這樣:
cm_cy_log_msg( CYLF_MIDDLEWARE, CY_LOG_ERR,\"Invalid arguments n\");
任何提示
發(fā)表于 05-31 12:45
評論