女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

log.c是什么?

小麥大叔 ? 來源:小麥大叔 ? 作者:小麥大叔 ? 2022-06-05 14:27 ? 次閱讀
這兩天發現一個還不錯的開源項目,記錄一下學習心得。對于嵌入式底層應用開發,基本離不開日志功能,這種輪子有很多,log.c 最簡單,達到了開箱即用的級別。

log.c 是什么?


	https://github.com/rxi/log.c 簡單地說,log.c 就是一個 C 語言的日志功能模塊。2900acd4-e171-11ec-ba43-dac502259ad0.png點擊查看大圖log.c 的幾個特點:代碼簡潔,就一個 .c 和 .h 文件,一共 200 行。設計優雅,打印日志的 API 只有 1 個。提供了將 log 輸入到不同目標的接口,例如輸入到文件。提供了實現線程安全的接口。 

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() 一樣。示例:下面的例子會將日志同時輸出到標準輸出和文件中。

	#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; } 運行:

	$./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 關于線程安全: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 的內部實現?

私有數據結構:293dfd46-e171-11ec-ba43-dac502259ad0.png點擊查看大圖全局變量 L 維護了 log.c 所需要的所有信息。void *udata 用于保存用戶數據,用戶可以將其用作任意用途。lock 是一個函數指針:。

	typedefvoid(*log_LockFn)(boollock,void*udata); 用戶可以用它來指定自己想用的鎖機制,例如 Pthread 的互斥量。int level 用于保存當前的 log 等級,等級大于 level 的 log 才會被輸出到標準輸出。bool quiet 用于打開、關閉 log 輸出。數組 callbacks 用于保存多種輸出方式,目前僅支持輸出到標準輸出和文件,有需要的話我們還可以將其擴展成輸出到 syslog、網絡等,每增加一種輸出方式就是構造一個 Callback,成員回調函數 log_LogFn 負責真正地 log 輸出功能:

	typedefvoid(*log_LogFn)(log_Event*ev); 公共數據結構:298ef3cc-e171-11ec-ba43-dac502259ad0.png點擊查看大圖一條 log 信息對應一個 log_Event。暴露這個數據結構是為了用戶可以編寫自己的 log 打印函數 log_LogFn 以輸出 log。公共的 API:整個 log.c 其實只提供了一個打印相關的 API:log_log()。log_trace() 等宏只是對 log_log() 的簡單封裝,這種簡潔地設計無論是對庫的用戶還是對庫的開發者而言,都是最幸福的事情。剩下的幾個 API 用于控制和功能擴展。log_log() 的實現思路1> 根據用于提供的 log 信息構造 1個 log_Event。2> 將 log 信息輸出到標準輸出。3> 遍歷所有 log Callback,逐一調用它們的打印函數 log_LogFn。 

總結

log.c 代碼優雅、設計簡潔、功能實用,這對庫的用戶和庫的開發者而言,都是一種幸福。如果你的項目需要一個簡單好用的日志功能,可以考慮集成開箱即用的 log.c

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5141

    文章

    19542

    瀏覽量

    315178
  • 開源項目
    +關注

    關注

    0

    文章

    38

    瀏覽量

    7423

原文標題:調試利器!一款輕量級日志庫 log.c

文章出處:【微信號:knifewheat,微信公眾號:小麥大叔】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    全棧開發進階指南:LuatOS-log庫從入門到實戰!

    本文將帶你深入探索LuatOS系統中log庫的核心原理與實戰技巧,通過代碼示例解析日志管理、錯誤追蹤及性能優化的最佳實踐,助力全棧工程師構建更穩健的物聯網應用。 今天,我們一起來認識LuatOS
    的頭像 發表于 05-15 16:12 ?2254次閱讀
    全棧開發進階指南:LuatOS-<b class='flag-5'>log</b>庫從入門到實戰!

    解鎖LuatOS-log庫:全棧工程師的日志管理實戰課!

    針對全棧開發者設計的實戰教程,本文聚焦LuatOS平臺log庫的高效使用,從基礎配置到高級調試策略,手把手教你搭建可擴展的日志系統,提升項目維護效率。 今天,我們一起來認識LuatOS的log
    的頭像 發表于 05-12 15:23 ?787次閱讀
    解鎖LuatOS-<b class='flag-5'>log</b>庫:全棧工程師的日志管理實戰課!

    請問cypress的demo運行log通過什么方式獲取?

    cypress的demo運行log通過什么方式獲取
    發表于 04-30 06:05

    LOG300 具有集成式低噪聲放大器的40MHz對數檢測器技術手冊

    LOG300 是一款集成模擬前端 (AFE),由低噪聲放大器 (LNA) 和對數檢測器塊組成。該器件支持高達 40MHz 的輸入頻率范圍和 98dB 的典型動態范圍,適用于需要寬動態電壓范圍和信號
    的頭像 發表于 03-18 10:17 ?372次閱讀
    <b class='flag-5'>LOG</b>300 具有集成式低噪聲放大器的40MHz對數檢測器技術手冊

    HarmonyOS NEXT 原生應用/元服務-ArkTS代碼調試Evaluate and log

    開發者可以通過 Evaluate and log 能力在代碼執行到斷點行時打印開發者指定的表達式。 操作步驟 在需要打印表達式結果的地方設置斷點。 右鍵斷點,然后點擊More按鈕。 勾選
    發表于 03-14 16:49

    恩智浦解讀Zephyr log系統的使用 Zephyr的shell和log功能介紹

    Zephyr log系統的使用,在使用log前需要: ? ? 1. 修改proj.conf打開log功能: CONFIG_LOG =y 2. 編輯main.
    的頭像 發表于 02-27 09:19 ?1031次閱讀
    恩智浦解讀Zephyr <b class='flag-5'>log</b>系統的使用 Zephyr的shell和<b class='flag-5'>log</b>功能介紹

    LOG200評估模塊

    電子發燒友網站提供《LOG200評估模塊.pdf》資料免費下載
    發表于 11-09 14:23 ?0次下載
    <b class='flag-5'>LOG</b>200評估模塊

    LOG114 VLogout輸出不正常的原因?

    你好,這是我的電路圖,目前的問題是VLogout的輸出不正常,不服從VLogout=0.375*log(I1/I2)+2.5V。 我之前使用log114芯片的時候,背部的exposed
    發表于 08-02 08:02

    用U盤記錄系統LOG信息的簡單步驟和方法

    ? # 01 前言 MCU 組成的系統在實際應用中,經常需要記錄系統 LOG 信息,可以是系統不同任務執行情況的 LOG 信息,也可以是內核寄存器等便于維護調試的信息,或者是傳感器的信息等。 上述
    的頭像 發表于 07-31 10:22 ?1225次閱讀
    用U盤記錄系統<b class='flag-5'>LOG</b>信息的簡單步驟和方法

    如何換算LOG200的輸入帶寬最大范圍?

    目前我司使用的是AD8305尋求LOG200進行替換,關于LOG200的信息仍然是偏少的,我希望獲得更多關于它的信息,主要點是關于帶寬的問題,我們的光學系統設計的帶寬計算為最高可能達到20MHz
    發表于 07-29 07:02

    求助,關于log114輸入端電流仿真問題求解

    我用以下兩種方式對log114輸入端口輸入電流進行仿真,為什么仿真中第一個的輸入端口電壓會變化而不是保持2V。輸入端口R5的阻值10K保持不變,輸入端電流IS1變化的時候,log114的輸入端的電壓也會變化,這是為什么呢
    發表于 07-29 06:42

    esp-mdf禁用log輸出報錯的原因?

    因為esp32的三個串口在項目中都占用了,所以要禁用log輸出。 通過下面的配置后,編譯報錯。 錯誤信息: esp-mdf/components/mdebug/mdebug_console.c
    發表于 06-28 13:22

    ESP32S2關閉ADC/DAC后重啟的原因?

    )0x400f3601: esp_log_writev at C:/Users/Administrator/Desktop/esp-idf/components/log/log.c:1
    發表于 06-20 06:26

    ESP32C3編譯出現multiple definition of `g_log_level\'的原因?

    如題,一個原是ESP32的物聯網例程,在改為ESP32C3后,編譯出現multiple definition of `g_log_level\'不良。 [2/3] Linking CXX
    發表于 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
    發表于 06-14 08:06