這兩天發(fā)現(xiàn)一個(gè)還不錯(cuò)的開源項(xiàng)目,記錄一下學(xué)習(xí)心得。對(duì)于嵌入式底層應(yīng)用開發(fā),基本離不開日志功能,這種輪子有很多,log.c 最簡(jiǎn)單,達(dá)到了開箱即用的級(jí)別。
點(diǎn)擊查看大圖log.c 的幾個(gè)特點(diǎn):代碼簡(jiǎn)潔,就一個(gè) .c 和 .h 文件,一共 200 行。設(shè)計(jì)優(yōu)雅,打印日志的 API 只有 1 個(gè)。提供了將 log 輸入到不同目標(biāo)的接口,例如輸入到文件。提供了實(shí)現(xiàn)線程安全的接口。
點(diǎn)擊查看大圖全局變量 L 維護(hù)了 log.c 所需要的所有信息。void *udata 用于保存用戶數(shù)據(jù),用戶可以將其用作任意用途。lock 是一個(gè)函數(shù)指針:。
點(diǎn)擊查看大圖一條 log 信息對(duì)應(yīng)一個(gè) log_Event。暴露這個(gè)數(shù)據(jù)結(jié)構(gòu)是為了用戶可以編寫自己的 log 打印函數(shù) log_LogFn 以輸出 log。公共的 API:整個(gè) log.c 其實(shí)只提供了一個(gè)打印相關(guān)的 API:log_log()。log_trace() 等宏只是對(duì) log_log() 的簡(jiǎn)單封裝,這種簡(jiǎn)潔地設(shè)計(jì)無(wú)論是對(duì)庫(kù)的用戶還是對(duì)庫(kù)的開發(fā)者而言,都是最幸福的事情。剩下的幾個(gè) API 用于控制和功能擴(kuò)展。log_log() 的實(shí)現(xiàn)思路:1> 根據(jù)用于提供的 log 信息構(gòu)造 1個(gè) log_Event。2> 將 log 信息輸出到標(biāo)準(zhǔn)輸出。3> 遍歷所有 log Callback,逐一調(diào)用它們的打印函數(shù) log_LogFn。
log.c 是什么?
https://github.com/rxi/log.c 簡(jiǎn)單地說,log.c 就是一個(gè) C 語(yǔ)言的日志功能模塊。
點(diǎn)擊查看大圖log.c 的幾個(gè)特點(diǎn):代碼簡(jiǎn)潔,就一個(gè) .c 和 .h 文件,一共 200 行。設(shè)計(jì)優(yōu)雅,打印日志的 API 只有 1 個(gè)。提供了將 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,...); 它們都是對(duì) log_log() 的簡(jiǎn)單封裝,用法和 printf() 一樣。示例:下面的例子會(huì)將日志同時(shí)輸出到標(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 是一個(gè)函數(shù)指針:。typedefvoid(*log_LockFn)(boollock,void*udata); 用戶可以用它來(lái)指定自己想用的鎖機(jī)制,例如 Pthread 的互斥量。int level 用于保存當(dāng)前的 log 等級(jí),等級(jí)大于 level 的 log 才會(huì)被輸出到標(biāo)準(zhǔn)輸出。bool quiet 用于打開、關(guān)閉 log 輸出。數(shù)組 callbacks 用于保存多種輸出方式,目前僅支持輸出到標(biāo)準(zhǔn)輸出和文件,有需要的話我們還可以將其擴(kuò)展成輸出到 syslog、網(wǎng)絡(luò)等,每增加一種輸出方式就是構(gòu)造一個(gè) Callback,成員回調(diào)函數(shù) log_LogFn 負(fù)責(zé)真正地 log 輸出功能:
typedefvoid(*log_LogFn)(log_Event*ev); 公共數(shù)據(jù)結(jié)構(gòu):
點(diǎn)擊查看大圖一條 log 信息對(duì)應(yīng)一個(gè) log_Event。暴露這個(gè)數(shù)據(jù)結(jié)構(gòu)是為了用戶可以編寫自己的 log 打印函數(shù) log_LogFn 以輸出 log。公共的 API:整個(gè) log.c 其實(shí)只提供了一個(gè)打印相關(guān)的 API:log_log()。log_trace() 等宏只是對(duì) log_log() 的簡(jiǎn)單封裝,這種簡(jiǎn)潔地設(shè)計(jì)無(wú)論是對(duì)庫(kù)的用戶還是對(duì)庫(kù)的開發(fā)者而言,都是最幸福的事情。剩下的幾個(gè) API 用于控制和功能擴(kuò)展。log_log() 的實(shí)現(xiàn)思路:1> 根據(jù)用于提供的 log 信息構(gòu)造 1個(gè) log_Event。2> 將 log 信息輸出到標(biāo)準(zhǔn)輸出。3> 遍歷所有 log Callback,逐一調(diào)用它們的打印函數(shù) log_LogFn。 總結(jié)
log.c 代碼優(yōu)雅、設(shè)計(jì)簡(jiǎn)潔、功能實(shí)用,這對(duì)庫(kù)的用戶和庫(kù)的開發(fā)者而言,都是一種幸福。如果你的項(xiàng)目需要一個(gè)簡(jiǎn)單好用的日志功能,可以考慮集成開箱即用的 log.c審核編輯 :李倩
聲明:本文內(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)注
5200文章
20458瀏覽量
334311 -
開源項(xiàng)目
+關(guān)注
關(guān)注
0文章
38瀏覽量
7613
原文標(biāo)題:調(diào)試?yán)?!一款輕量級(jí)日志庫(kù) log.c
文章出處:【微信號(hào):knifewheat,微信公眾號(hào):小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
利用Last Log(Ramoops)排查系統(tǒng)問題:配置與實(shí)踐指南
在嵌入式系統(tǒng)(如基于瑞芯微 RK3399 的 Android 設(shè)備)開發(fā)或維護(hù)中,系統(tǒng)常因內(nèi)核崩潰(Panic)、用戶空間異常等突發(fā)情況重啟,導(dǎo)致關(guān)鍵日志丟失。此時(shí),Last Log(依托
探索 HMC - C088:高頻高性能 Successive Detection Log Video Amplifier
探索 HMC - C088:高頻高性能 Successive Detection Log Video Amplifier 在當(dāng)今電子科技迅猛發(fā)展的時(shí)代,高頻、高性能的電子元件對(duì)于各類電子系統(tǒng)的升級(jí)
【瑞薩RA6E2】板載uart測(cè)試,控制臺(tái)shell及帶顏色輸出log的實(shí)現(xiàn)
的調(diào)試信息類型顯示不同的顏色,接下來(lái)也實(shí)現(xiàn)一下。
這里直接貼.c.h出代碼,如下:
log.c
/**
* @file log.c
* @author Letter
發(fā)表于 11-09 23:50
easyflash 寫入多條log保存到flash成功,讀取多條失敗是怎么回事?
很多人都在推,所以我就用了。
按照教程,我只需要log保存功能,使能EF_USING_LOG,ENV跟IAP暫時(shí)不需要,所以全部屏蔽了。
#ifndef EF_CFG_H_
#define
發(fā)表于 09-24 07:13
Texas Instruments LOG300DEVM和LOG300RGTEVM評(píng)估模塊數(shù)據(jù)手冊(cè)
Texas Instruments LOG300DEVM和LOG300RGTEVM評(píng)估模塊 (EVM) 設(shè)計(jì)用于評(píng)估集成對(duì)數(shù)檢波器、低噪聲放大器 (LNA) 和輸入頻率檢測(cè)器的性能,所有這些都集成在
Texas Instruments LOG200EVM放大器評(píng)估模塊 (EVM)數(shù)據(jù)手冊(cè)
Texas Instruments LOG200EVM放大器評(píng)估模塊 (EVM) 是一個(gè)用于評(píng)估LOG200的開發(fā)平臺(tái),LOG200是一款精密、高速對(duì)數(shù)放大器,集成了光電二極管偏置和暗電流校正功能
Texas Instruments LOG300 40MHz對(duì)數(shù)探測(cè)器數(shù)據(jù)手冊(cè)
Texas Instruments LOG300 40MHz對(duì)數(shù)探測(cè)器是一款由低噪聲放大器 (LNA) 和對(duì)數(shù)探測(cè)器模塊組成的集成模擬前端 (AFE)。該器件支持高達(dá)40MHz的輸入頻率范圍
CYW20829全雙工UART和I2C Master同時(shí)工作導(dǎo)致UART log輸出異常怎么解決?
CYW20829使用code example HAL_I2C_Master, 修改UART使用P1_3, P1_2, 修改I2C Master使用P0_3, P0_2, uart log和I2
發(fā)表于 06-27 07:57
easyflash 寫入多條log保存到flash成功,讀取多條失敗的原因?
很多人都在推,所以我就用了。
按照教程,我只需要log保存功能,使能EF_USING_LOG,ENV跟IAP暫時(shí)不需要,所以全部屏蔽了。
#ifndef EF_CFG_H_
#define
發(fā)表于 06-13 07:02
全棧開發(fā)進(jìn)階指南:LuatOS-log庫(kù)從入門到實(shí)戰(zhàn)!
本文將帶你深入探索LuatOS系統(tǒng)中log庫(kù)的核心原理與實(shí)戰(zhàn)技巧,通過代碼示例解析日志管理、錯(cuò)誤追蹤及性能優(yōu)化的最佳實(shí)踐,助力全棧工程師構(gòu)建更穩(wěn)健的物聯(lián)網(wǎng)應(yīng)用。 今天,我們一起來(lái)認(rèn)識(shí)LuatOS
解鎖LuatOS-log庫(kù):全棧工程師的日志管理實(shí)戰(zhàn)課!
針對(duì)全棧開發(fā)者設(shè)計(jì)的實(shí)戰(zhàn)教程,本文聚焦LuatOS平臺(tái)log庫(kù)的高效使用,從基礎(chǔ)配置到高級(jí)調(diào)試策略,手把手教你搭建可擴(kuò)展的日志系統(tǒng),提升項(xiàng)目維護(hù)效率。 今天,我們一起來(lái)認(rèn)識(shí)LuatOS的log庫(kù)
LOG300 具有集成式低噪聲放大器的40MHz對(duì)數(shù)檢測(cè)器技術(shù)手冊(cè)
LOG300 是一款集成模擬前端 (AFE),由低噪聲放大器 (LNA) 和對(duì)數(shù)檢測(cè)器塊組成。該器件支持高達(dá) 40MHz 的輸入頻率范圍和 98dB 的典型動(dòng)態(tài)范圍,適用于需要寬動(dòng)態(tài)電壓范圍和信號(hào)
HarmonyOS NEXT 原生應(yīng)用/元服務(wù)-ArkTS代碼調(diào)試Evaluate and log
開發(fā)者可以通過 Evaluate and log 能力在代碼執(zhí)行到斷點(diǎn)行時(shí)打印開發(fā)者指定的表達(dá)式。
操作步驟
在需要打印表達(dá)式結(jié)果的地方設(shè)置斷點(diǎn)。
右鍵斷點(diǎn),然后點(diǎn)擊More按鈕。
勾選
發(fā)表于 03-14 16:49
log.c是什么?
評(píng)論